0

我有一个包含年份数据的列表。我想将这些组件组合成一个按行匹配的数据框。示例列表:

    List [[1]]
    State Year   X   Y
    23     1971  etc  etc
    47     1971  etc  etc

    List[[2]]
    State Year   X   Y
    13     1972  etc etc
    23     1973  etc  etc
    47     1973  etc  etc

   etc....

   List[[45]]
     State Year   X   Y
     1     2017  etc etc
     2     2017 etc  etc
     3     2017 etc  etc
     1     2017  etc etc
    23     2017 etc  etc
    47     2017 etc  etc

我希望数据框看起来像(我知道我将不得不通过并删除一些额外的列:

    State   1971_X    1971_Y    1972_X    1972_Y....2018_X    2019_Y
    1         NA        NA       NA        NA         etc       etc
    2         NA        NA       etc       etc        etc       etc   
    3         etc       ect      etc       etc        etc       etc  
    ...
    50        NA        NA       etc        etc       etc       etc

我已经尝试了该命令Outcomewanted=do.call("cbind", examplelist),但收到了消息

"Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 36, 40, 20, 42, 38, 26, 17, 31, 35, 23, 33, 13, 29, 28, 32, 34, 41, 37, 43, 39, 30, 14, 10, 4, 7"

似乎 cbind.fill 命令可能是一个选项,但已被淘汰?感谢您提前提供任何帮助。

4

1 回答 1

1

您可以在操作reshape后使用do.call(rbind())

res <- reshape(do.call(rbind, lst), idvar="state", timevar="year", direction="wide")
res
#   state     x.1971    y.1971    x.1972      y.1972     x.1973     y.1973
# 1    23  1.3709584 0.3631284        NA          NA -0.1061245  2.0184237
# 2    24 -0.5646982 0.6328626        NA          NA  1.5115220 -0.0627141
# 3    13         NA        NA 0.4042683 -0.09465904         NA         NA

数据

lst <- list(structure(list(state = c(23, 24), year = c(1971, 1971), 
    x = c(1.37095844714667, -0.564698171396089), y = c(0.363128411337339, 
    0.63286260496104)), class = "data.frame", row.names = c(NA, 
-2L)), structure(list(state = c(13, 23, 24), year = c(1972, 1973, 
1973), x = c(0.404268323140999, -0.106124516091484, 1.51152199743894
), y = c(-0.0946590384130976, 2.01842371387704, -0.062714099052421
)), class = "data.frame", row.names = c(NA, -3L)))
于 2020-03-19T15:26:45.390 回答