【问题标题】:Calculate means of a row with a condition in column selection in R在R中的列选择中计算具有条件的行的平均值
【发布时间】:2016-03-31 16:39:08
【问题描述】:

我有一个不同时间段内不同文章的销售列表,格式如下:

col <- c("A", "B", "C")
A <- c(1,0,0)
B <- c(0,1,0)
C <- c(0,0,1)
colnames(df) <- c('article','w1', 'w2', 'w3')
df
 article w1 w2 w3
 A       1  0  0
 B       0  1  0
 C       0  0  1

我需要创建一个新列来计算行的平均值,但仅在行中第一次出现正数之后才开始。这意味着如果一行看起来像:

A 0 1 0

算法必须只考虑最后两个值(1 和 0)并将值 (1+0)/2 = 0.5 放入新列。最终结果必须如下所示:

 article w1 w2 w3 Mean
 A       1  0  0  0.33
 B       0  1  0   0.5
 C       0  0  1     1

谁能告诉我怎么弄好?

非常感谢

【问题讨论】:

  • 总是二进制数据集吗?此外,如果这些只是数字,最好采用矩阵格式。
  • 如果你确实只有 0/1,你可以使用行总和和每行前 1 的索引; m = as.matrix(df[-1L]); rowSums(m) / (ncol(m) - max.col(m, "first") + 1L)

标签: r mean


【解决方案1】:

which(x &gt; 0) 将返回x &gt; 0 所在的第一个元素的索引。

df$Mean = apply(df[-1], 1, function(x) mean(x[min(which(x > 0)):length(x)]))

> df
  article w1 w2 w3      Mean
1       A  1  0  0 0.3333333
2       B  0  1  0 0.5000000
3       C  0  0  1 1.0000000

【讨论】:

  • 我认为应该注意which返回所有x大于零的索引。因此,也许您应该在which 调用的末尾添加[1] 以使x[which(x &gt; 0)[1]:length(x)] 在提供的示例中,它不会导致问题,但是如果有多个元素大于零,则只需要获取第一个项目。
  • @giraffehere 好点,出于某种原因,我认为它只返回了第一个。
  • @giraffehere 实际上无论如何也能正常工作,因为只有集合的第一个元素会被用于(set):length(x)。但这是不好的做法
  • 你说得对,不过我相信 R 会发出警告(但仍会运行)。
【解决方案2】:

这是另一种选择

library(matrixStats)
df$Mean <- rowMeans((NA^(!rowCumsums(as.matrix(df[-1]))))*df[-1], 
                                  na.rm=TRUE)
df$Mean
#[1] 0.3333333 0.5000000 1.0000000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    相关资源
    最近更新 更多