【问题标题】:r rbind dataframes in each list using lapply functionr rbind 使用 lapply 函数在每个列表中的数据帧
【发布时间】:2020-04-04 08:46:36
【问题描述】:

我想添加一些数据点。 odtl 是原始数据,adtl 是要添加的数据点。 adtl 设置为 NA,但将在 rbind 之后由 zoo :: na.spline 插值。
在此过程中,两个列表(odtladtl)分别包含三个数据帧。我想按照它们加载到每个列表中的顺序组合数据框。 我使用for 函数成功,如下所示。但是我的lapply 函数不起作用。你能把这个循环作为lapplyapply 家庭函数吗? 谢谢。

> odtl # original dataset
[[1]]
  x index
1 1     1
2 2     2
3 3     3
4 4     4
5 5     5

[[2]]
  x index
1 1     1
2 2     2
3 3     3
4 4     4

[[3]]
  x index
1 1     1
2 2     2
3 3     3

> adtl # dataset for add
[[1]]
   x index
1 NA   1.5

[[2]]
   x index
1 NA   1.5
2 NA   2.5
3 NA   3.5

[[3]]
   x index
1 NA   1.5
2 NA   2.5

> wdtl <- list() # This is the goal.
> for(i in 1:length(odtl)){
+   wdtl[[i]] <- rbind(odtl[[i]], adtl[[i]])
+ }
> wdtl # This is the goal but I want complete it by lapply or something
[[1]]
   x index
1  1   1.0
2  2   2.0
3  3   3.0
4  4   4.0
5  5   5.0
6 NA   1.5

[[2]]
   x index
1  1   1.0
2  2   2.0
3  3   3.0
4  4   4.0
5 NA   1.5
6 NA   2.5
7 NA   3.5

[[3]]
   x index
1  1   1.0
2  2   2.0
3  3   3.0
4 NA   1.5
5 NA   2.5

【问题讨论】:

  • Map(rbind, odtl, adtl) 我想。
  • 我已经挣扎了一个多小时。谢谢各位天才。

标签: r dataframe apply lapply rbind


【解决方案1】:

我认为@thelatemail 在 cmets 中的解决方案应该是最优雅的解决方案。如果你想使用lapply,那么下面就是你想要的东西

wdtl <- sapply(seq(odtl), function(k) rbind(odtl[[k]],adtl[[k]]))

【讨论】:

    【解决方案2】:

    您可以使用Map(),它按元素将函数应用于其每个参数的第一个元素。

    Map(rbind, odtl, adtl)
    # [[1]]
    # x index
    # 1   1   1.0
    # 2   2   2.0
    # 3   3   3.0
    # 4   4   4.0
    # 5   5   5.0
    # 6  NA   1.5
    # 7  NA   2.5
    # 8  NA   3.5
    # 9  NA   4.5
    # 10 NA   5.5
    # 
    # [[2]]
    # x index
    # 1  1   1.0
    # 2  2   2.0
    # 3  3   3.0
    # 4  4   4.0
    # 5 NA   1.5
    # 6 NA   2.5
    # 7 NA   3.5
    # 8 NA   4.5
    # 
    # [[3]]
    # x index
    # 1  1   1.0
    # 2  2   2.0
    # 3  3   3.0
    # 4 NA   1.5
    # 5 NA   2.5
    # 6 NA   3.5
    

    数据

    odtl  <- list(data.frame(x=1:5, index=1:5),
                  data.frame(x=1:4, index=1:4),
                  data.frame(x=1:3, index=1:3))
    adtl  <- list(data.frame(x=NA, index=seq(1.5, 5.5, 1)),
                  data.frame(x=NA, index=seq(1.5, 4.5, 1)),
                  data.frame(x=NA, index=seq(1.5, 3.5, 1)))
    

    【讨论】:

      【解决方案3】:

      特别是来自lapplyapply 等函数家族,您可以使用mapply

      > odtl  <- list(data.frame(x=1:5, index=1:5),
                      data.frame(x=1:4, index=1:4),
                      data.frame(x=1:3, index=1:3))
      > adtl  <- list(data.frame(x=NA, index=seq(1.5, 5.5, 1)),
                      data.frame(x=NA, index=seq(1.5, 4.5, 1)),
                      data.frame(x=NA, index=seq(1.5, 3.5, 1)))v
      > mapply(rbind, odtl, adtl, SIMPLIFY = FALSE)
      # [[1]]
      #     x index
      # 1   1   1.0
      # 2   2   2.0
      # 3   3   3.0
      # 4   4   4.0
      # 5   5   5.0
      # 6  NA   1.5
      # 7  NA   2.5
      # 8  NA   3.5
      # 9  NA   4.5
      # 10 NA   5.5
      # 
      # [[2]]
      #    x index
      # 1  1   1.0
      # 2  2   2.0
      # 3  3   3.0
      # 4  4   4.0
      # 5 NA   1.5
      # 6 NA   2.5
      # 7 NA   3.5
      # 8 NA   4.5
      # 
      # [[3]]
      #    x index
      # 1  1   1.0
      # 2  2   2.0
      # 3  3   3.0
      # 4 NA   1.5
      # 5 NA   2.5
      # 6 NA   3.5
      

      请注意,Mapmapply(FUN = f, ..., SIMPLIFY = FALSE) 的包装器。

      【讨论】:

      • 确实,Map 只是mapply(FUN = f, ..., SIMPLIFY = FALSE) 的包装
      猜你喜欢
      • 2020-09-11
      • 1970-01-01
      • 2018-06-08
      • 2013-10-15
      • 2019-11-05
      • 2018-12-04
      • 2018-06-04
      • 2010-12-11
      • 2018-06-21
      相关资源
      最近更新 更多