我想通过考虑多个条件(和一个额外的,见下文)的值求和来构建一个新变量。在这里你可以看到R代码,直到像我目前的问题。
# The raw dataframe
area <- c("A", "A", "B", "A", "C", "B", "A", "B", "A", "C")
varclass <- c("Z1", "Z1", "Z1", "Z2", "Z1", "Z1", "Z2", "Z1", "Z2", "Z2")
count <- c(45, 56, 2, 8, 345, 3, 98, 2, 6, 9)
df1 <- data.frame(area,
varclass,
count,
stringsAsFactors = FALSE)
df1
# See how df1 looks like...
# area varclass count
#1 A Z1 45
#2 A Z1 56
#3 B Z1 2
#4 A Z2 8
#5 C Z1 345
#6 B Z1 3
#7 A Z2 98
#8 B Z1 2
#9 A Z2 6
#10 C Z2 9
# Building the final dataframe
df2 <- data.frame(unique(df1$area),
stringsAsFactors = FALSE)
names(df2)[1] <- "area"
# See how df2 looks like...
# area
#1 A
#2 B
#3 C
# The new variable to build
df2$Z1_sum <- sum(df1[df1$varclass == "Z1" & df1$area == df2$area,]$count)
# doesn't work
# See what I hope
# area Z1_sum
#1 A 101
#2 B 7
#3 C 345
正如您在最后一行中看到的,我想在df2数据库中构建一个新变量Z1_sum。Z1_sum是来自df1数据库的计数之和,其中varclass = "Z1"
和df1$area
满足df2$area
当前行的值(在MS Excel中,这意味着使用LC1或$A2单元格ID)。
请考虑这样一个事实,我并不是在寻找通过使用group by条件或dcast
函数从df1直接构建df2的解决方案。我只想要一个公式,它允许我在新列中返回正确的值。这是我的附加条件为什么?因为我接下来要用最复杂的公式来构建其他变量,而不仅仅是求和。通过理解如何进行这样的条件运算,我希望继续前进...
谢谢你的帮忙。
3条答案
按热度按时间ffscu2ro1#
你的意思是:
或
尝试使用:
这将以“长”格式给予数据:
现在,您需要使用以下命令将其重塑为“宽”格式:
或:
z3yyvxxp2#
只需根据您希望在最终总和中计算的Z* 进行子集。
p4tfgftt3#
您可以使用
dplyr
获得所需的结果:dplyr
动词应该是很好的解释,%>%
是管道操作,从一个函数获取输出,并将其作为下一个函数的第一个输入。group_by
在这里按列area
分组,所以当我们计算总和(在summarize
中)时,它是每个区域组的总和。filter
对数据进行子集化。