如何基于多数据框公共变量为DataFrame新增列及计算衍生列
解决方案(R语言)
这里有个简单直接的方法来实现你要的效果,不管用基础R还是tidyverse都能轻松搞定,下面是具体步骤:
1. 先创建示例数据(方便复现)
首先我们把你给出的所有数据框用代码创建出来:
# 主数据框 df1 <- data.frame( Class = c("Paladin", "Fighter", "Wizard", "Rouge"), Race = c("Human", "Elf", "Gnome", "Elf"), Level = c(4, 5, 3, 4), stringsAsFactors = FALSE ) # 任务1数据 Mission1 <- data.frame( Class = c("Paladin", "Fighter", "Cleric", "Wizard"), Exp = c(80, 70, 100, 80), stringsAsFactors = FALSE ) # 任务2数据 Mission2 <- data.frame( Class = c("Cleric", "Fighter", "Wizard"), Exp = c(200, 220, 190), stringsAsFactors = FALSE ) # Boss战数据 Boss1 <- data.frame( Class = c("Wizard", "Paladin", "Cleric", "Druid"), Exp = c(500, 520, 490, 500), stringsAsFactors = FALSE )
2. 添加匹配标记列
我们需要判断df1中的每个职业是否出现在Mission1、Mission2、Boss1的职业列表里,用%in%就能快速实现,再把逻辑值转成1/0:
方法一:基础R写法
# 复制df1到df2,避免修改原数据 df2 <- df1 # 添加匹配列:存在为1,不存在为0 df2$Mission1 <- as.integer(df2$Class %in% Mission1$Class) df2$Mission2 <- as.integer(df2$Class %in% Mission2$Class) df2$Boss1 <- as.integer(df2$Class %in% Boss1$Class)
方法二:tidyverse写法(更简洁)
如果你习惯用dplyr,可以这样写:
library(dplyr) df2 <- df1 %>% mutate( Mission1 = as.integer(Class %in% Mission1$Class), Mission2 = as.integer(Class %in% Mission2$Class), Boss1 = as.integer(Class %in% Boss1$Class) )
3. 计算衍生列
接下来直接对已有的标记列求和,得到Missions和Final列:
# 计算任务总和 df2$Missions <- df2$Mission1 + df2$Mission2 # 计算最终总和 df2$Final <- df2$Missions + df2$Boss1
最终结果
运行完上面的代码后,df2就会和你预期的完全一致:
> df2 Class Race Level Mission1 Mission2 Missions Boss1 Final 1 Paladin Human 4 1 0 1 1 2 2 Fighter Elf 5 1 1 2 0 2 3 Wizard Gnome 3 1 1 2 1 3 4 Rouge Elf 4 0 0 0 0 0
小解释
%in%是R里用来检查元素是否存在于另一个向量中的常用操作符,返回TRUE/FALSEas.integer()把逻辑值转换成整数:TRUE→1,FALSE→0,刚好符合你的需求- 衍生列的计算就是简单的列之间相加,逻辑清晰易懂
内容的提问来源于stack exchange,提问作者Krutik
相关产品推荐
相关产品推荐

