У меня есть список кадров даты:
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 в результирующем фрейме данных.
Есть ли простой способ сделать это?
Нет, я хочу манипулировать списком, созданным в примере, для создания единого фрейма данных из комбинированных фреймов данных с выбранными только SN и Age.
@markus Вы тоже можете использовать c, он делает то же самое. Хотя, может быть, не лучший для читабельности
Спасибо за разъяснения. Просто не был уверен, было ли это задумано или нет.





Слишком просто? Всегда ли Age и SB находятся на первом и втором месте?
list <- as.data.frame(c(x[1:2],y[1:2],z[1: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
Это достаточно просто?
xyz <- bind_rows(select(x, SN, Age), select(y, SN, Age), select(z, SN, Age))
Если вам нужно общее решение, которое также будет работать, когда в вашем списке фреймов данных более трех элементов:
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))
Вот решение 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)]
Created on 2019-02-27 by the reprex package (v0.2.1)
Данный
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
Подход с purrr:
library(purrr)
lst %>% map_dfr(`[`, c("SN", "Age"))
В котором говорится, сопоставьте функцию извлечения [ с элементами «SN» и «Возраст» из каждого списка, затем свяжите все эти элементы в data.frame df — и эй, пока вы связываете их вместе, пожалуйста, свяжите рВот так dfr.
Или lst %>% map_dfr(select, SN, Age), если вы тоже используете dplyr
Я подошел к этому так же, как igorkf, но немного изменил синтаксис:
xyz <- x %>% select(SN, age) %>%
bind_rows(y %>% select(SN, age) %>%
bind_rows(z %>% select(SN, age))
Возможно, ваша четвертая строка должна быть
lst <- list(x, y, z)? Название вашего вопроса предполагает это.