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

Posted

技术标签:

【中文标题】在 R 中创建新的数据框列,以行值为条件而不进行迭代?【英文标题】:Create new dataframe column in R that conditions on row values without iterating? 【发布时间】:2022-01-19 22:30:47 【问题描述】:

假设我有以下数据框“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 中有更有效的方法来做到这一点。

谢谢!

【问题讨论】:

是的。首先,您需要将第二帧合并/加入到第一帧(ref1,ref2),然后总结。无需迭代。如果您有df2 的样本,我们可能会提供帮助。 (即使使用df2,也可能是前两个裁判的欺骗,加上summarize by group。) 【参考方案1】:

你考虑过使用dplyr 包吗?您可以使用一些 SQL 风格的语法,让这项工作变得快速而简单。

代码类似于

library(dplyr)

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

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

【讨论】:

@vodoochile92,因为你是新人,如果这解决了你的问题,请accept it;这样做为问题提供了一些结束,告知后续读者完成的期望;它还向回答者提供“代表”,作为感谢他们的时间的另一种形式。如果这不能解决您的问题,“为什么”的解释会很有用。不要急于接受,一个常见的策略是对可能有竞争力的答案开放,但请记住(在一三天内)回来接受。谢谢!

以上是关于在 R 中创建新的数据框列,以行值为条件而不进行迭代?的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串以在 spark 数据框中创建新列

如何在R中的空数据框中创建新列[重复]

如何在 R 中创建新的日期(月、年)数据

如何使用 R 语言在基于多个二进制变量的数据框中创建新变量?

通过分解另一个变量在R中创建新变量[重复]

如何在 pyspark 中创建新列,其中条件取决于列的后续值?