使用lapply函数重排每个列表中的数据帧

时间:2019-12-11 05:45:39

标签: r dataframe apply lapply rbind

我想添加一些数据点。 odtl是原始数据,adtl是要添加的数据点。 adtl设置为NA,但将在zoo :: na.spline之后由rbind进行插值。
在此过程中,两个列表(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

3 个答案:

答案 0 :(得分:1)

您可以使用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)))

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

特别是在(venv) ☁ python-codelab [master] ⚡ coverage run /Users/ldu020/workspace/github.com/mrdulin/python-codelab/src/stackoverflow/58857424/test_a.py . ---------------------------------------------------------------------- Ran 1 test in 0.001s OK (venv) ☁ python-codelab [master] ⚡ coverage report -m Name Stmts Miss Cover Missing -------------------------------------------------------------------- src/stackoverflow/58857424/a.py 8 1 88% 7 src/stackoverflow/58857424/test_a.py 13 0 100% -------------------------------------------------------------------- TOTAL 21 1 95% lapply等函数系列中,您可以使用apply

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 Map的包装。