【问题标题】:Bind rows by by select column names from a list?通过从列表中选择列名来绑定行?
【发布时间】:2019-02-27 19:47:18
【问题描述】:

我有一个日期框架列表:

x <- data.frame("SN" = 1:25,"Age" = 1:25,"Gender" = rep(c("Male","Female"),25))
y <- data.frame("SN" = 1:25,"Age" = 1:25,"Occupation" = rep(c("Barber","Doctor"),25))
z <- data.frame("SN" = 1:25,"Age" = 1:25)
list <- c(x,y,z)

我正在尝试将数据帧绑定到一个数据帧中,未列出。但是,我只想拉出特定的列来制作最终数据框。

例如,我希望将 x、y 和 z 组合成一个数据帧,结果数据帧中只有 SN 和 Age。

有简单的方法吗?

【问题讨论】:

  • 你的第四行应该是lst &lt;- list(x, y, z)吗?您的问题标题表明了这一点。
  • 不,我想操作在示例中创建的列表以生成组合数据帧的单个数据帧,仅选择 SN 和 Age。
  • @markus 你也可以使用c,它做同样的事情。虽然可能不是最好的可读性
  • 感谢您的澄清。只是不确定这是否有意。

标签: r list dplyr


【解决方案1】:

如果您想要一个通用解决方案,当您的数据框列表中包含三个以上元素时也可以使用:

library(dplyr)

x <- data.frame("SN" = 1:25,"Age" = 1:25,"Gender" = rep(c("Male","Female"),25))
y <- data.frame("SN" = 1:25,"Age" = 1:25,"Occupation" = rep(c("Barber","Doctor"),25))
z <- data.frame("SN" = 1:25,"Age" = 1:25)
lst <- list(x,y,z)

df <- do.call(rbind, lapply(lst, select, SN, Age))

【讨论】:

    【解决方案2】:

    purrr 的方法:

    library(purrr)
    lst %>% map_dfr(`[`, c("SN", "Age"))
    

    也就是说,将 extract [ 函数映射到每个列表中的项目“SN”和“Age”,然后将所有这些元素绑定到一个 data.frame df 中——嘿,当你在将它们绑定在一起,请绑定 rows so dfr

    【讨论】:

    • 或者lst %&gt;% map_dfr(select, SN, Age),如果你也在使用dplyr
    【解决方案3】:

    这够简单吗?

    xyz <- bind_rows(select(x, SN, Age), select(y, SN, Age), select(z, SN, Age))
    

    【讨论】:

      【解决方案4】:

      我不明白你的问题,但这有帮助吗?

      bind_rows( (x %>% select(SN, Age)), (y %>% select(SN, Age)), z)
          SN Age
      1    1   1
      2    2   2
      3    3   3
      4    4   4
      5    5   5
      6    6   6
      7    7   7
      8    8   8
      9    9   9
      10  10  10
      11  11  11
      12  12  12
      13  13  13
      14  14  14
      15  15  15
      16  16  16
      17  17  17
      18  18  18
      19  19  19
      20  20  20
      21  21  21
      22  22  22
      23  23  23
      24  24  24
      25  25  25
      26   1   1
      27   2   2
      28   3   3
      29   4   4
      30   5   5
      31   6   6
      32   7   7
      33   8   8
      34   9   9
      35  10  10
      36  11  11
      37  12  12
      38  13  13
      39  14  14
      40  15  15
      41  16  16
      42  17  17
      43  18  18
      44  19  19
      45  20  20
      46  21  21
      47  22  22
      48  23  23
      49  24  24
      50  25  25
      51   1   1
      52   2   2
      53   3   3
      54   4   4
      55   5   5
      56   6   6
      57   7   7
      58   8   8
      59   9   9
      60  10  10
      61  11  11
      62  12  12
      63  13  13
      64  14  14
      65  15  15
      66  16  16
      67  17  17
      68  18  18
      69  19  19
      70  20  20
      71  21  21
      72  22  22
      73  23  23
      74  24  24
      75  25  25
      76   1   1
      77   2   2
      78   3   3
      79   4   4
      80   5   5
      81   6   6
      82   7   7
      83   8   8
      84   9   9
      85  10  10
      86  11  11
      87  12  12
      88  13  13
      89  14  14
      90  15  15
      91  16  16
      92  17  17
      93  18  18
      94  19  19
      95  20  20
      96  21  21
      97  22  22
      98  23  23
      99  24  24
      100 25  25
      101  1   1
      102  2   2
      103  3   3
      104  4   4
      105  5   5
      106  6   6
      107  7   7
      108  8   8
      109  9   9
      110 10  10
      111 11  11
      112 12  12
      113 13  13
      114 14  14
      115 15  15
      116 16  16
      117 17  17
      118 18  18
      119 19  19
      120 20  20
      121 21  21
      122 22  22
      123 23  23
      124 24  24
      125 25  25
      

      【讨论】:

        【解决方案5】:

        这是一个data.table 解决方案,适用于任何具有任意数量列的data.table。它根据列的名称排列列,并在需要时用NA 填充任何空白。您始终可以对任意数量的 data.tables 使用相同的方法。

        library(data.table)
        library(magrittr)
        
        x <- data.frame("SN" = 1:25,"Age" = 1:25,"Gender" = rep(c("Male","Female"),25))
        y <- data.frame("SN" = 1:25,"Age" = 1:25,"Occupation" = rep(c("Barber","Doctor"),25))
        z <- data.frame("SN" = 1:25,"Age" = 1:25)
        
        listy <- list(x,y,z)
        
        a <- rbindlist(listy,
                       use.names = TRUE,
                       fill = TRUE) %>% 
          .[, .(SN, Age)]
        

        reprex package (v0.2.1) 于 2019 年 2 月 27 日创建

        【讨论】:

          【解决方案6】:

          给定

          lst <- c(x,y,z)
          

          事实证明我们可以做到

          out <- unstack(stack(lst))
          head(out)
          #  SN Age
          #1  1   1
          #2  2   2
          #3  3   3
          #4  4   4
          #5  5   5
          #6  6   6
          

          【讨论】:

            【解决方案7】:

            太简单了? Age 和 SB 总是在 1 和 2 位吗?

            list <- as.data.frame(c(x[1:2],y[1:2],z[1:2]))
            

            【讨论】:

            • 我认为这适用于这个特定的例子。实际数据有数百列,可能顺序不同。不过,对于给定的变量,它们应该具有相同的列名。
            【解决方案8】:

            我使用与 igorkf 相同的方法,但设置的语法略有不同:

            xyz <- x %>% select(SN, age) %>%      
                bind_rows(y %>% select(SN, age) %>%       
                bind_rows(z %>% select(SN, age))  
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-12-22
              • 2021-01-21
              • 2013-02-25
              • 2021-10-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多