根据值是否大于该行中的另一个值

时间:2017-07-21 20:58:48

标签: r

我试图在数据框中使用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和编码很新,所以我一直陷入困境。我已经在网上进行了广泛的搜索,但还没有找到一个似乎可以解决问题的例子。

2 个答案:

答案 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))