【问题标题】:Mapply to Add Column to Each Dataframe in a List映射以将列添加到列表中的每个数据框
【发布时间】:2016-06-30 06:06:30
【问题描述】:

实现了上一个问题的一些代码: 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 介于上述两个数据帧之间,是空的。这会影响 Map 将年份绑定到 dfs 的顺序吗?本质上,我有一个输出,其中一些数据属于与它所附的地图不同的年份。我测试了年份列表的长度和顺序,并将其与最终的输出年份进行了比较。它们是相同的。有什么想法吗?

【问题讨论】:

  • 顺便说一句,在随机示例之前使用set.seed 通常会很好。它使比较和验证结果变得更加容易。

标签: r list dataframe data.table


【解决方案1】:

我们根据“dfs”中每个元素的长度创建一个逻辑索引,使用它来子集“dfs”和“years”,然后使用Map 执行cbind

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])

然后使用fill = TRUE 执行rbindlist,以防`list 中所有data.frames 中的列数不同。

rbindlist(a, fill = TRUE)

数据

dfs[[3]] <- list(NULL)
dfs[[4]] <- data.frame()
years <- 2013:2016

【讨论】:

    【解决方案2】:

    使用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 与cols 上的i 合并,然后将z 从i 复制到X。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 2018-09-27
      • 1970-01-01
      • 2021-07-14
      • 2017-02-06
      相关资源
      最近更新 更多