从上一个问题实施了一些代码: Lapply to Add Columns to Each Dataframe in a List
使用上述方法,我收到了损坏的数据。虽然我无法提供实际数据,但我想知道是否需要实施其他参数来防止混乱。
基本上,这个:
Require: data.table
df1 <- data.frame(x = runif(3), y = runif(3))
df2 <- data.frame(x = runif(3), y = runif(3))
dfs <- list(df1, df2)
years <- list(2013, 2014)
a<-Map(cbind, dfs, year = years)
final<-rbindlist(a)
但是应用于数千个数据框列表的列表具有不正确的结果。假设某些数据帧(比如两个上述数据帧之间的某个df 1.5)是空的。这会影响地图将年份与dfs联系起来的顺序吗?从本质上讲,我有一个输出,其中一些数据属于不同于附加Map的数据。我测试了年份列表的长度和顺序,并将其与最终的输出年份进行了比较。它们完全相同。有什么想法吗?
答案 0 :(得分:1)
我们根据&#39; dfs&#39;中的每个元素的长度创建一个逻辑索引,使用它来分配&#39; dfs&#39;而且&#39;年&#39;然后使用cbind
Map
i1 <- sapply(dfs, length)>1
或者使其更严格
i1 <- sapply(dfs, function(x) is.data.frame(x) & !is.null(x) & length(x) >0 )
a <- Map(cbind, dfs[i1], year = years[i1])
然后使用rbindlist
执行fill = TRUE
,以防`列表中的所有data.frame
列中的列数不相同。
rbindlist(a, fill = TRUE)
dfs[[3]] <- list(NULL)
dfs[[4]] <- data.frame()
years <- 2013:2016
答案 1 :(得分:1)
使用idcol
rbindlist
参数,然后添加year
列:
res = rbindlist(dfs, idcol=TRUE)
res[.(.id = 1:2, year = 2013:2014), on=".id", year := i.year]
X[i, on=cols, z := i.z]
将X
与i
cols
合并,然后将z
从i
复制到X
。