将rowSums的结果分配给R中的新列

时间:2019-11-25 09:20:07

标签: r rowsum

我有下面的数据框,其中包含推销员每个季度售出的产品数量。

Ag      Q1  Q2  Q3  Q4
s121    4   3   0   0
S431    0   0   2   1   
S246    0   0   0   2
S444    2   2   2   2   

我正在尝试创建一个计算所得的列C,该列基本上是值不为零的所有列的总和。因此,基本上推销员已经活跃了几个季度。

预期输出:

Ag      Q1  Q2  Q3  Q4 C
s121    4   3   0   0   2
S431    0   0   2   1   2
S246    0   0   0   2   1
S444    2   2   2   2   4

我尝试过

df$C <- df[rowSums(df[,c(Q1,Q2,Q3,Q4)])]

但是给未定义的列选择错误。 有人可以帮我纠正这个问题吗?

3 个答案:

答案 0 :(得分:1)

就是这样:

dat$C <- rowSums(dat[, -1] != 0)
dat

#     Ag Q1 Q2 Q3 Q4 C
# 1 s121  4  3  0  0 2
# 2 S431  0  0  2  1 2
# 3 S246  0  0  0  2 1
# 4 S444  2  2  2  2 4

数据:

dat <- structure(
  list(
    Ag = c("s121", "S431", "S246", "S444"),
    Q1 = c(4L,
           0L, 0L, 2L),
    Q2 = c(3L, 0L, 0L, 2L),
    Q3 = c(0L, 2L, 0L, 2L),
    Q4 = c(0L, 1L, 2L, 2L)
  ),
  class = "data.frame",
  row.names = c(NA,-4L)
)

答案 1 :(得分:0)

使用apply(),而您想要的是length()

dat <- transform(dat, C=apply(dat[-1], 1, function(x) length(x[x != 0])))
dat
#     Ag Q1 Q2 Q3 Q4 C
# 1 s121  4  3  0  0 2
# 2 S431  0  0  2  1 2
# 3 S246  0  0  0  2 1
# 4 S444  2  2  2  2 4

当您转换为rowSums()时,也可以使用"logical"进行此操作。

transform(dat, C=rowSums(as.data.frame(lapply(dat[-1], as.logical))))
#     Ag Q1 Q2 Q3 Q4 C
# 1 s121  4  3  0  0 2
# 2 S431  0  0  2  1 2
# 3 S246  0  0  0  2 1
# 4 S444  2  2  2  2 4

数据

dat <- structure(list(Ag = c("s121", "S431", "S246", "S444"), Q1 = c(4L, 
0L, 0L, 2L), Q2 = c(3L, 0L, 0L, 2L), Q3 = c(0L, 2L, 0L, 2L), 
    Q4 = c(0L, 1L, 2L, 2L)), row.names = c(NA, -4L), class = "data.frame")

答案 2 :(得分:0)

@utubun的方法可能是最简单的,但这里还有一些基本的R选项。

df$C <-  apply(df[-1] != 0, 1, sum)
df
#    Ag Q1 Q2 Q3 Q4 C
#1 s121  4  3  0  0 2
#2 S431  0  0  2  1 2
#3 S246  0  0  0  2 1
#4 S444  2  2  2  2 4

或者使用Reducelapply

df$C <- Reduce(`+`, lapply(df[-1], function(x) x != 0))

数据

df <- structure(list(Ag = c("s121", "S431", "S246", "S444"), Q1 = c(4L, 
0L, 0L, 2L), Q2 = c(3L, 0L, 0L, 2L), Q3 = c(0L, 2L, 0L, 2L), 
Q4 = c(0L, 1L, 2L, 2L)), row.names = c(NA, -4L), class = "data.frame")