r - 如果它们具有相似的 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]
}
}
我感谢任何帮助解决这个问题。
解决方案
我们可以使用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
如果它是list
s data.frame
,我们可以这样做reduce
library(purrr)
reduce(list_df, regex_left_join)
推荐阅读
- python - 数据库拒绝枚举类中的新值
- jquery - 即使在添加延迟()之后也直接显示 div
- regex - shell 包装器根据其输出重新启动脚本
- apache-spark - PYSPARK :将一个表列与另一个表中的两列之一连接起来
- java - 无法编译 Oracle 文档示例
- asp.net-mvc - HtmlHelper For 方法签名中的表达式是否仅用于类型检查视图?
- java - java - 如何使控制器端点在java spring中获取两个不同的对象?
- jquery - AJAX 没有得到 API 的响应
- android - 对话框中的Webview连续上下滚动
- microsoft-edge-extension - 替代缺少身份的API?