如何通过条件求和填充新的dataframe列

2mbi3lxu  于 2023-09-27  发布在  其他
关注(0)|答案(3)|浏览(91)

我想通过考虑多个条件(和一个额外的,见下文)的值求和来构建一个新变量。在这里你可以看到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的解决方案。我只想要一个公式,它允许我在新列中返回正确的值。这是我的附加条件为什么?因为我接下来要用最复杂的公式来构建其他变量,而不仅仅是求和。通过理解如何进行这样的条件运算,我希望继续前进...
谢谢你的帮忙。

ffscu2ro

ffscu2ro1#

你的意思是:

df2 <- setNames(
                aggregate(
                          count ~ area,
                          df1[df1$varclass == "Z1", ],
                          sum
                          ),
                c("area", "Z1_sum")
               )
df2
  area Z1_sum
1    A    101
2    B      7
3    C    345

df2$Z1_sum <- aggregate(count ~ area, df1[df1$varclass == "Z1", ], sum)$count
  • 编辑以回应您的评论。*

尝试使用:

df2 <- aggregate(
                 count ~ area + varclass,
                 df1,
                 sum
                )

这将以“长”格式给予数据:

df2
  area varclass count
1    A       Z1   101
2    B       Z1     7
3    C       Z1   345
4    A       Z2   112
5    C       Z2     9

现在,您需要使用以下命令将其重塑为“宽”格式:

df2 <- xtabs(count ~ area + varclass, df2)
    varclass
area  Z1  Z2
   A 101 112
   B   7   0
   C 345   9

或:

df2 <- reshape(df2, idvar = "area", timevar = "varclass", direction = "wide")
  area count.Z1 count.Z2
1    A      101      112
2    B        7       NA
3    C      345        9
z3yyvxxp

z3yyvxxp2#

只需根据您希望在最终总和中计算的Z* 进行子集。

df1Z1 <- df1[df1$varclass %in% c("Z1"), ]
aggregate(count ~ area, data = df1Z1, FUN = sum)

  area count
1    A   101
2    B     7
3    C   345
p4tfgftt

p4tfgftt3#

您可以使用dplyr获得所需的结果:

library(dplyr)

df2 <- group_by(df1, area) %>% 
  filter(varclass == "Z1") %>% 
  summarize(Z1_sum = sum(count)) %>% 
df2
#> # A tibble: 3 x 2
#>    area Z1_sum
#>   <chr>  <dbl>
#> 1     A    101
#> 2     B      7
#> 3     C    345

dplyr动词应该是很好的解释,%>%是管道操作,从一个函数获取输出,并将其作为下一个函数的第一个输入。group_by在这里按列area分组,所以当我们计算总和(在summarize中)时,它是每个区域组的总和。filter对数据进行子集化。

相关问题