我试图在数据框中使用R来获得多个列(但不是全部)的总和。捕获的是我只想对大于该行的中值的值求和。值,并忽略零。
这是一个显示两行data
的示例,其中有20列,其中6列(列x1:x6)具有我要考虑的总和值:
x1 x2 x3 x4 x5 x6
4 4 5 0 0 2
2 3 0 1 5 0
忽略零,第一行的中位数为4,第二行的中位数为2.5。所以我想总结一下>的剩余数字。第一行中的图4中的>在第二个2.5中,将这些数字放在一个新列中。
有很多行数据。我已经在另一列中放置了中值(我只是使用excel来获取这个),我将其称为data$med_no_zero
,因此可以使用它而不必在R代码中计算该值。
我玩过if / then语句,apply函数和其他一些东西,但我对R和编码很新,所以我一直陷入困境。我已经在网上进行了广泛的搜索,但还没有找到一个似乎可以解决问题的例子。
答案 0 :(得分:1)
您可以在行(apply
)上使用MARGIN = 1
来运行所需的功能
apply(X = df, MARGIN = 1, function(x)
sum(x[x > median(replace(x, x==0, NA), na.rm = TRUE)], na.rm = TRUE))
#[1] 5 8
答案 1 :(得分:0)
这是一种替代方法,使用rowSums
来计算总和,并使用带有NA和取幂的技巧将零变为NA,以便在中位数计算中将其移除。
rowSums(dat * (dat > apply(dat * NA^!dat, 1, median, na.rm=TRUE)))
[1] 5 8
apply(dat * NA^!dat, 1, median, na.rm=TRUE)
计算每一行的中间值,通过将这些值转换为带有dat * NA^!dat
的NA,然后在na.rm
中使用median
参数,删除值为0。 / p>
然后dat > apply(dat * NA^!dat, 1, median, na.rm=TRUE)
返回一个逻辑矩阵,如果dat中的单元格值大于行的中位数(此比较是通过循环完成),则条目为TRUE。
最后,我们得到乘法数据到这个矩阵,以获得大于修改中位数的dat值和其他地方的0。结果将输入rowSums
,计算每行的总和。
数据强>
dat <-
structure(list(x1 = c(4L, 2L), x2 = c(4L, 3L), x3 = c(5L, 0L),
x4 = 0:1, x5 = c(0L, 5L), x6 = c(2L, 0L)), .Names = c("x1",
"x2", "x3", "x4", "x5", "x6"), class = "data.frame", row.names = c(NA,
-2L))