计算其上方行内数据框内值的出现次数

时间:2018-01-02 22:41:40

标签: r count

我正在尝试找到一种方法来创建一个矩阵,该矩阵对数据帧的每一行中的值进行计数。我希望它能够识别数据帧每一行中的值,并计算该值出现在行上方的所有行中的值(不是整个数据帧)的次数。

在数据帧的单行中,相同的值永远不会出现多次。

例如:

# 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次发生一次)

5 个答案:

答案 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来说很新,他是我可以一直遵循的例子而不需要查看任何内容。我会很高兴找到你所分享的所有其他方式和新的(对我而言)功能/方法。