Связать строки, выбрав имена столбцов из списка? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть список фреймов даты:

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 голосов
/ 27 февраля 2019

Учитывая

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
0 голосов
/ 27 февраля 2019

Подход с purrr:

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

В котором говорится, сопоставьте функцию извлечения [ с элементами "SN" и "Age" из каждого списка, затем свяжите все эти элементы вa data.frame df - и, эй, пока вы связываете их вместе, пожалуйста, свяжите r ows , так что dfr.

0 голосов
/ 27 февраля 2019

Вот решение 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)]

Создано в 2019-02-27 пакетом Представить (v0.2.1)

0 голосов
/ 27 февраля 2019

Если вам нужно общее решение, которое также будет работать, если в вашем списке данных есть более трех элементов:

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))
0 голосов
/ 27 февраля 2019

Это достаточно просто?

xyz <- bind_rows(select(x, SN, Age), select(y, SN, Age), select(z, SN, Age))
0 голосов
/ 27 февраля 2019

У меня нет вашего вопроса, но это помогает?

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
0 голосов
/ 27 февраля 2019

Слишком просто?Age и SB всегда на 1 и 2 месте?

list <- as.data.frame(c(x[1:2],y[1:2],z[1:2]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...