gpt4 book ai didi

r - 快速、简洁地生成唯一矩阵行的有序频率计数的方法

转载 作者:行者123 更新时间:2023-12-01 22:11:26 24 4
gpt4 key购买 nike

我有一个包含一些非唯一行的矩阵,例如:

x <- read.csv(textConnection(
'0,1,1,0
0,1,1,0
1,0,1,0
0,1,0,1
1,0,0,1'),
header = FALSE)

挑战一种快速方法(可能是一个名为 umat_count 的函数)来计算该矩阵的唯一行的数量,按照它们在 x 中出现的顺序。理想情况下,结果如下:

y <- umat_count(x) 
y
## 2 1 1 1

为了测试这个结果正是我想要的,我们可以创建 x 的唯一版本,然后对其行进行 y 次采样,然后返回 x:

ux <- unique(x)
ux[rep(1:nrow(ux), y),]

## V1 V2 V3 V4
## 1 0 1 1 0
## 1.1 0 1 1 0
## 3 1 0 1 0
## 4 0 1 0 1
## 5 1 0 0 1

所以问题是如何快速编写umat_count? ATM 这是我的笨重代码,但我确信有更好的方法,也许是单行:

umat_count <- function(x) {
xp <- apply(x, 1, paste0, collapse = "") # "pasted" version of constraints
freq <- table(xp) # frequency of occurence of each individual
xu <- unique(x) # save only unique individuals
rns <- as.integer(row.names(xu)) # save the row names of unique values of ind
xpu <- xp[rns]
# xpu <- apply(xu, 1, paste0, collapse = "") # old way of generating ind_pu
o <- order(xpu, decreasing = TRUE) # the order of the output (to rectify table)
y <- freq[o] # frequency with which each individual appears (more efficient way?)
y
}

y <- umat_count(x)

就上下文而言,我在数据准备阶段使用它来优化 R 脚本以进行“空间微观模拟”,如本课本中所述:https://www.dropbox.com/s/ffnrl2ofv18rm3n/book-cambridge.pdf?dl=0

非常感谢。

最佳答案

更新的答案:

y <- apply(x, 1, paste, collapse = " ")
y <- rle(sort(as.numeric(factor(y, unique(y), ordered = T))))$lengths

或者do.call方式:

y <- do.call(paste, as.data.frame(x))
y <- rle(sort(as.numeric(factor(y, unique(y), ordered = T))))$lengths
<小时/>

尝试

y <- rle(apply(x, 1, paste, collapse = " "))
# y$lengths is the vector containing the number of times each row appears
# y$values are the rows in the order that y$lengths reports frequency

感谢@JonathanChang,请参阅this page此页面为他的解决方案。如果行无序,您应该在使用rle之前对它们进行排序。

y <- rle(sort(apply(x, 1, paste, collapse = " ")))

关于r - 快速、简洁地生成唯一矩阵行的有序频率计数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26160079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com