我有一个14列和数千行的数据框。我想计算或选择第1列中的值为0且其他13列中的值为0的行,然后计算第二列中的值为0,其他13列中的值为0以上,依此类推所有14列。 有关如何做到这一点的任何提示吗?
非常感谢
答案 0 :(得分:0)
试试这个。第一行是复制数据,第二行是根据逻辑表达式显示计数结果
df <- data.frame(replicate(14, sample(0:5, 1000, replace = T)))
result <- sapply(1:14, function(i) {sum(df[,i]==0 & apply(df[-i]>0, 1, all))})
names(result) <- paste0("Col_", 1:14)
result
Col_1 Col_2 Col_3 Col_4 Col_5 Col_6 Col_7 Col_8 Col_9 Col_10 Col_11 Col_12 Col_13 Col_14
12 12 19 15 18 20 19 13 19 15 12 17 15 18
答案 1 :(得分:0)
您是否了解apply
功能?如果您编写的函数读取长度为14的向量并根据向量是否满足要求而输出T
或F
,那么您可以使用apply
将此函数应用于所有data.frame的行,产生数千T
s和F
s的向量,可用于选择或计数(后者只需将向量放入sum
函数)。
示例:
cow <- function(colnr, x){#colnr is number of column you want zero, x is vector of length 14
all(x[-colnr] > 0) & x[colnr] == 0)
}
horse <- function(colnr){#produces sequence of Trues and Falses telling you which columns satisfy the condition
apply(yourdataframe, 1, cow)
}
#example output:
horse(1)
#while we're at it: create a vector of length 14 containing the number of rows satisfying the 14 conditions:
sapply(seq(1:14), horse)
1
中的apply
是因为您要应用于行而不是列。函数sapply
类似于apply,然后将函数应用于向量的每个元素而不是数据帧的每一行。
更新:这个答案与我在打字时出现的zyunaidi相同。
答案 2 :(得分:0)
使用zyurnaidi
中的示例数据,您可以执行此操作。
使用在0
上设置数组索引的which
查找data.frame中的所有TRUE
值,然后删除重复的行(其他列中的0
)并计算每列的出现次数:
set.seed(1234)
df <- data.frame(replicate(14, sample(0:5, 1000, replace = T)))
a <- which(df == 0, arr.ind = T)
table(a[ !(duplicated(a[, 1]) | duplicated(a[, 1], fromLast=T)), 2])
1 2 3 4 5 6 7 8 9 10 11 12 13 14
18 26 19 14 11 20 21 10 24 21 15 11 22 11