在 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 中创建新的数据框列,以行值为条件而不进行迭代?的主要内容,如果未能解决你的问题,请参考以下文章