如何在R中计算属于同一数据帧中处理组合的列中的记录数(即行,单元格)?

时间:2015-06-16 18:28:52

标签: r

这是我在这个论坛上的第一个问题,我对R的经验有限,所以如果问题在某种程度上不清楚或是否过于基本,我会道歉。

我有一个名为值的数据框,包含一个样本编号列,两个因子变量(H和W)和几个数字列(在剪切后命名为数字间隔),如下所示:

sample  H   W   (12.95,13]  (13,13.05]  (13.05,13.1]    (13.1,13.15]
130 bg  d   0   0   0   0
131 bg  d   0   0   0   0
132 bg  d   0   0   0   0
133 x   i   0   0   0   0
134 x   i   0   0   0   0
135 x   i   0   0   0   0
136 x   i   0   0   0   0
137 x   i   0   0   0   0
138 x   i   0   0   0   0
139 x   i   0   0   0   0
140 x   i   0   0   0   0
141 x   i   0   35947.65    0   0
142 x   i   0   0   0   0
143 x   i   0   0   0   0
144 x   i   0   0   0   0
145 x   i   0   0   0   73709.67
146 x   i   0   0   0   0
147 x   i   21756.63    0   32362.41    0
148 x   i   0   0   0   0
149 x   i   0   0   0   0
150 x   i   0   0   0   0
151 x   i   0   0   0   0
152 x   c   0   0   0   0
153 x   c   0   0   0   0
154 x   c   0   0   0   0
155 x   c   0   0   0   32578.03

我需要计算每个治疗组合的每个数字列中的行数,并且样本数的值大于0.我已经尝试了聚合,计数和求和函数但到目前为止没有成功。

有人可以帮我解决这个问题吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

使用数据表(并假设df是您的数据框):

library(data.table)
setDT(df)[`colname`>0, .N, by=list(H, W, sample)]

setDT(df)[`colname`>0, .N, by=list(H, W)]

如果您不关心sample

您应该将colname替换为您正在查看的特定列的名称。这对我来说更容易检查您是否提供了reproducible example

答案 1 :(得分:0)

#replicable example
set.seed(123)
values <- data.frame(sample=1:100,
                     a=rep(1,100),
                     b=rep(c(1,2),50),
                     v1=rbinom(100,1,.1) * runif(100),
                     v2=rbinom(100,1,.1) * runif(100),
                     v3=rbinom(100,1,.1) * runif(100)
                     )

aggregate(cbind(v1, v2, v3) ~ a + b, # apply fcn to LHS grouped by RHS
          data=values,              
          FUN=function(x) sum(x>0)  # sum of TRUE v>0's is count of v's greater than 0 
          )
#   a b v1 v2 v3
# 1 1 1  4  4  7
# 2 1 2  3  6  2

答案 2 :(得分:0)

也许我没有得到它(我的解决方案似乎非常简单),但我只是在行上应用列的总和与0不同的总和。 输出是一个数字向量,其长度等于您的数据行数,其中:

  • 0表示没有一列的值不是0
  • 1表示至少有一列的值大于0,依此类推......

     apply(!df[, 4:7] == 0, 1, sum)
    
    [1] 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 2 0 0 0 0 0 0 0 1
    

答案 3 :(得分:0)

使用plyr的不完美解决方案(我非常确定dplyr包可以做得更好,但我不太熟悉它)

缺点是必须分别计算每列的总和 - 如果有3或4个,则可以,但100个间隔是不可行的。

##Generate fake data with 3 samples, 2 factors 3 levels each 
##and 3 observations per combination
df <- expand.grid(sample = letters[1:3], 
                  f1 = paste0('x', 1:3), 
                  f2 = paste0('y', 1:3))
df <- rbind(df, df, df)
nums <- matrix(rnorm(4*nrow(df)), ncol = 4)
colnames(nums) <- paste0('val_', 1:4)
nums[nums < 1] <- 0
df <- cbind(df, nums)

##Summarize
require(plyr)
ddply(df, .(sample, f1, f2), summarize, 
           sum_1 = sum(val_1 > 0),
           sum_2 = sum(val_2 > 0))