Связать строки, выбрав имена столбцов из списка?

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

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 <- list(x, y, z)? Название вашего вопроса предполагает это.

markus 27.02.2019 20:53

Нет, я хочу манипулировать списком, созданным в примере, для создания единого фрейма данных из комбинированных фреймов данных с выбранными только SN и Age.

Devin 27.02.2019 20:55

@markus Вы тоже можете использовать c, он делает то же самое. Хотя, может быть, не лучший для читабельности

IceCreamToucan 27.02.2019 20:57

Спасибо за разъяснения. Просто не был уверен, было ли это задумано или нет.

markus 27.02.2019 20:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
1 062
8

Ответы 8

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

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

Я думаю, что это будет работать в этом конкретном примере. Фактические данные содержат сотни столбцов, которые могут располагаться в разном порядке. Однако они должны иметь одинаковые имена столбцов для данной переменной.

Devin 27.02.2019 20:57

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

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

IceCreamToucan 27.02.2019 21:07

Я подошел к этому так же, как igorkf, но немного изменил синтаксис:

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

Другие вопросы по теме