这是我在这个论坛上的第一个问题,我对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.我已经尝试了聚合,计数和求和函数但到目前为止没有成功。
有人可以帮我解决这个问题吗?
谢谢!
答案 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不同的总和。 输出是一个数字向量,其长度等于您的数据行数,其中:
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))