计算R中列选择中具有条件的行的平均值

计算R中列选择中具有条件的行的平均值,r,mean,R,Mean,我有一份不同商品的销售清单,格式如下: 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 算法必须只考虑最后两个值(1和0),并将值(1+0)/2=0

我有一份不同商品的销售清单,格式如下:

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
算法必须只考虑最后两个值(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
谁能告诉我怎么做才对吗

非常感谢
,其中(x>0)
将返回
x>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
哪个(x>0)
将返回
x>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

这是另一个选择

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
库(matrixStats)

df$Mean这里是另一个选项

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
库(matrixStats)

df$表示它总是二进制数据集吗?此外,如果这些都是数字,最好采用矩阵格式。如果确实只有0/1,则可以使用每行的行和以及前1的索引<代码>m=矩阵(df[-1L]);行和(m)/(ncol(m)-max.col(m,“first”)+1L)
它总是二进制数据集吗?此外,如果这些都是数字,最好采用矩阵格式。如果确实只有0/1,则可以使用每行的行和以及前1的索引<代码>m=矩阵(df[-1L]);行和(m)/(ncol(m)-max.col(m,“first”)+1L)
我认为应该注意,
它返回x大于零的所有索引。因此,也许您应该在
[1]
调用的
末尾添加一个
[1]
来生成
x[which(x>0)[1]:length(x)]
在提供的示例中,它不会引起问题,但是如果有多个元素大于零,则只需要子集来获取第一项。@giraffhere,出于某种原因,我认为它只返回了第一个。@giraffhere实际上也可以在任何情况下工作,因为只有集合的第一个元素才能用于
(set):length(x)
。但是这是一个糟糕的做法。你是对的,我相信R会抛出一个警告(但仍在运行)。我认为应该注意,
which
返回x大于零的所有索引。因此,也许您应该在
[1]
调用的
末尾添加一个
[1]
来生成
x[which(x>0)[1]:length(x)]
在提供的示例中,它不会引起问题,但是如果有多个元素大于零,则只需要子集来获取第一项。@giraffhere,出于某种原因,我认为它只返回了第一个。@giraffhere实际上也可以在任何情况下工作,因为只有集合的第一个元素才能用于
(set):length(x)
。但这是一个糟糕的做法。你是对的,我相信R会发出警告(但仍然会跑)。