时间:2016-05-18 13:56:16

标签: r dataframe

我有一个14列和数千行的数据框。我想计算或选择第1列中的值为0且其他13列中的值为0的行,然后计算第二列中的值为0,其他13列中的值为0以上,依此类推所有14列。 有关如何做到这一点的任何提示吗?

非常感谢

3 个答案:

答案 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的向量并根据向量是否满足要求而输出TF,那么您可以使用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