通过从列表中选择列名称来绑定行?

时间:2019-02-27 19:47:18

标签: r list 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)
list <- c(x,y,z)

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

因此,例如,我希望将x,y和z合并到一个数据帧中,并在结果数据帧中仅包含SN和Age。

是否有一种简单的方法?

7 个答案:

答案 0 :(得分:3)

这够简单吗?

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

答案 1 :(得分:3)

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

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 :(得分:3)

使用purrr的方法:

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

说,将提取的[函数映射到每个列表的“ SN”和“ Age”项上,然后将所有这些元素绑定到一个data.frame df中–嘿,将它们绑定在一起时,请绑定 r ows ,所以dfr

答案 3 :(得分:2)

太简单了吗? Age和SB始终位于第一和第二位吗?

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

答案 4 :(得分:2)

我没有你的问题,但这有帮助吗?

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 :(得分:2)

这是一个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-02-27创建

答案 6 :(得分:2)

给出

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