首页 > 解决方案 > 如果它们具有相似的 ID,则从另一个数据帧向现有数据帧添加新列

问题描述

我有一个包含 65 行和 225 列的 16 个数据框的列表(例如,df1)。我想从另一个数据框(例如,df2)的列向所有这些数据框添加一列(时间),当它们具有匹配 ID 时,它们具有 265 行和 4 列。让我们通过以下可重现的示例来澄清问题。

df1<-data.frame(Id=c("TC-02-1998-Alex","TC-08-2003-Ben","TC-27-2006-Tom","TC-27-2007-Shan"),
                kps=c(70,90,100,80))

df2<-data.frame(Id=c("TC-02-1984","TC-02-1998","TC-06-1999","TC-08-2003","TC-27-2006","H-10","TC-27-2007","W1-10-112"),
                Time=c(188,223,1455,667,45,432,89,2311))

最终,我想实现像 result_df1 这样的数据框:

result_df1<-data.frame(Id=c("TC-02-1998-Alex","TC-08-2003-Ben","TC-27-2006-Tom","TC-27-2007-Shan"),
                   kps=c(70,90,100,80),Time=c(223,667,45,89))

我试过这段代码,但是,它不起作用。

df1_str<-substr(df1[,1],1,10)
df2_str<-substr(df2[,1],1,10)

for (i in 1:nrow(df2)) {
  
if (df1_str==df2_str){
  df2$time<-df1$Time[i]
  
}
}

我感谢任何帮助解决这个问题。

标签: r

解决方案


我们可以使用regex_left_join它,它更简单,可以适用于各种情况,即即使字符串在开头或结尾有所不同

library(fuzzyjoin)
regex_left_join(df1, df2)%>% 
    select(Id = Id.x, kps, Time)
#               Id kps Time
#1 TC-02-1998-Alex  70  223
#2  TC-08-2003-Ben  90  667
#3  TC-27-2006-Tom 100   45
#4 TC-27-2007-Shan  80   89

如果它是lists data.frame,我们可以这样做reduce

library(purrr)
reduce(list_df, regex_left_join) 

推荐阅读