我有下面的数据框,其中包含推销员每个季度售出的产品数量。
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)])]
但是给未定义的列选择错误。 有人可以帮我纠正这个问题吗?
答案 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
或者使用Reduce
和lapply
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")