在 R 中创建新的数据框列,该列以行值为条件而不进行迭代?

Create new dataframe column in R that conditions on row values without iterating?

假设我有以下数据框“df”:

names <- c("Bob","Mary","Ben","Lauren")
number <- c(1:4)
age <- c(20,33,34,45)
df <- data.frame(names,number,age)

假设我有另一个包含数千人的数据框(“df2”),我想对另一个数据框中的人的收入求和,这些人在“df”中的每一行都有给定的名字、数字和年龄。也就是说,对于“df”的每一行“i”,我想创建第四列“TotalIncome”,它是数据框“df2”中具有给定姓名、年龄和号码的所有人的收入总和。换句话说,对于每一行“i”:

df$TotalIncome[i] <- sum(
  df2$Income[df2$Name == df1$Name[i] &
  df2$Numbers == df1$Numbers[i] &
  df2$Age == df1$Age[i]], na.rm=TRUE)

有没有一种方法可以做到这一点,而不必为每一行“i”在 for 循环中迭代并执行上述代码?有没有办法使用 apply() 为整个向量计算这个而不是只单独迭代每一行?我正在处理的实际数据集很大,迭代需要很长时间,我希望在 R 中有更有效的方法来做到这一点。

谢谢!

您是否考虑过使用 dplyr 软件包?您可以使用一些 SQL 风格的语法,使这项工作变得简单快捷。

代码类似于

library(dplyr)

df %>% left_join(df2) %>%
    group_by(name, numbers, age) %>%
    summarize(TotalIncome = sum(Income))

我建议您在 dplyr 网站上找到备忘单或查看 Wickham and Grolemund book