我正在尝试找到一种方法来创建一个矩阵,该矩阵对数据帧的每一行中的值进行计数。我希望它能够识别数据帧每一行中的值,并计算该值出现在行上方的所有行中的值(不是整个数据帧)的次数。
在数据帧的单行中,相同的值永远不会出现多次。
例如:
# df:
a b c
1 2 3
3 4 5
3 2 6
7 8 9
8 3 6
矩阵结果:
0 0 0(没有发生任何df值,因为上面没有行)
1 0 0(上面发生了3次,其他没发生过)
2 1 0(上面发生了3次,上面发生了2次,没有发生过6次)
0 0 0(上面的行中没有发生df值)
1 3 1(8次发生一次,3次发生3次,6次发生一次)
答案 0 :(得分:1)
这是一种方式:
# convert to a vector
x = as.vector(t(as.matrix(df)))
# get counts of each unique element (in the right place)
# and add them up
res = rowSums(sapply(unique(x), function(z) {
r = integer(length(x))
r[x == z] = 0:(sum(x == z) - 1)
return(r)
}))
# convert to matrix
res = matrix(res, ncol = ncol(df), byrow = T)
res
# [,1] [,2] [,3]
# [1,] 0 0 0
# [2,] 1 0 0
# [3,] 2 1 0
# [4,] 0 0 0
# [5,] 1 3 1
使用此数据:
df = read.table(text = "
a b c
1 2 3
3 4 5
3 2 6
7 8 9
8 3 6", header = T)
答案 1 :(得分:0)
其他三种方法:
1)基础R:
I:\real
给出:
temp <- stack(df)[c(outer(c(0,5,10), 1:5, '+')),] temp$val2 <- with(temp, ave(values, values, FUN = seq_along)) - 1 df2 <- unstack(temp, val2 ~ ind)
2)> df2
a b c
1 0 0 0
2 1 0 0
3 2 1 0
4 0 0 0
5 1 3 1
:
data.table
给出相同的结果。
3)使用library(data.table)
melt(setDT(df)[, r := .I],
id = 'r')[order(r), val2 := rowid(value) - 1
][, dcast(.SD, rowid(variable) ~ variable, value.var = 'val2')
][, variable := NULL][]
:
tidyverse
当然,它也会给出相同的结果。
答案 2 :(得分:0)
这是另一种解决方案:
SAFE_CAST(UPDT_DT_TM AS DATETIME)
答案 3 :(得分:0)
另一个......为了好玩
out<-matrix(1,nrow = nrow(df),ncol = ncol(df))
for(i in 1:nrow(df)){
out[i,]<-sapply(1:ncol(df),function(z) sum(unlist(df[0:(i-1),]) %in% df[i,z]))
}
out
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 1 0 0
[3,] 2 1 0
[4,] 0 0 0
[5,] 1 3 1
答案 4 :(得分:0)
我知道我们不应该用“谢谢”发表评论,但谢谢大家。我已经将Brian的回复标记为最有用,因为我对R来说很新,他是我可以一直遵循的例子而不需要查看任何内容。我会很高兴找到你所分享的所有其他方式和新的(对我而言)功能/方法。