将列添加到列表

时间:2016-06-30 06:06:31

标签: r list dataframe data.table

从上一个问题实施了一些代码: 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的数据。我测试了年份列表的长度和顺序,并将其与最终的输出年份进行了比较。它们完全相同。有什么想法吗?

2 个答案:

答案 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]Xi cols合并,然后将zi复制到X