r - 地图内的地图?使用两个数据框列表中的列
问题描述
我在 R 中工作并且有两个数据框列表。我需要向 list1 中的数据框添加一列,填充从 list2 中相应数据框获取的值。我想我需要 Map 内的 Map 或 Map 内的 lapply,但我只使用过 Map 和 lapply 自己,或 lapply 内的 lapply,所以我无法对正确的代码进行排序。下面的列表与我正在使用的列表类似。
dfa<-data.frame(tom=sample(seq(as.Date("2020-01-01"),as.Date("2020-03-01"), 1), 20), id=seq(1:20))
dfb<-data.frame(tom=sample(seq(as.Date("2020-01-01"),as.Date("2020-02-01"), 1), 32), id=seq(1:32))
list1<-list(dfa, dfb)
df1<-data.frame(date=seq(as.Date("2020-01-01"), as.Date("2020-03-01"), 1),num=sample(1:200, 61))
df2<-data.frame(date=seq(as.Date("2020-01-01"), as.Date("2020-03-01"), 1),num=sample(4:200, 61))
list2<-list(df1, df2)
我尝试过的代码可能接近或完全偏离标准。我正在尝试将新列“d1”添加到 list1 中的所有数据框。d1 中的值应从 list2 的数据帧中的变量“num”中提取,其中日期与 list1 中数据帧的日期匹配。
list3<-Map(function(x, y){
Map(function(v, w){
v<-cbind(v, d1=w[w$date==v, w$num])}, x$tom, y)},list1, list2)
这只是返回有关使用原子向量的错误:“w$date 中的错误:$ 运算符对原子向量无效”
但是,如果我将其更改为索引...
list3<-Map(function(x, y){
Map(function(v, w){
v<-cbind(v, d1=w[w[,1]==v, w[,2]])}, x$tom, y)}, list1, list2)
它也不高兴:“ [.default
(w, , 1) 中的错误:维数不正确”
至此,我有点忘记了我试图在最里面的函数中引用的内容以及如何正确引用它。这甚至接近我想要的吗?
解决方案
我们可以使用merge
Map(function(dat1, dat2) merge(dat1, dat2, by.x = 'tom',
by.y = 'date', all.x = TRUE), list1, list2)
如果我们需要重命名列
Map(function(dat1, dat2) {
out <- merge(dat1, dat2, by.x = 'tom', by.y = 'date', all.x = TRUE)
names(out)[3] <- 'd1'
out},
list1, list2)
推荐阅读
- arrays - Matlab从元胞数组到矩阵数组的转换
- python - 总和忽略熊猫数据框中的字符串
- flutter - 从 Flutter 中的图库中选择图像时出现问题
- java - 更新多对多表用户中的角色
- java - Spring Boot Java 原型 ArrayList
- node.js - 如何将我的定制网站部署到自定义域名?
- flutter - Dio/Flutter - 无法获取 http 错误代码,Dio 抛出无效错误
- javascript - Javascript firebase 函数未按定义的顺序执行
- selenium-webdriver - Selenium:单击包含链接或href的文本
- react-native - 如何从 webview 获取会话。?