Как выбрать несколько столбцов на основе разных фреймов данных в R - PullRequest
0 голосов
/ 03 марта 2020

У меня есть три кадра данных следующим образом:

df1<-read.table(text="id Group Location
1121	B	O1
1141	M	O4
1196	K	O3
1166	P	O9",header=TRUE)


df2<-read.table(text="id Cup	Class Garden
1141	1	N	V19
1166	3	N	GH12
1121	4	Y	O11
1146	2	N	BP1",header=TRUE)


df3<-read.table(text="id	Cup	Class	Garden
1166	3	N	A11
1176	7	Y	L12
1196	8	N	N20
1120	4	N	J0",header=TRUE)

Как видите, в df2 и df3 есть два столбца, которых нет в df1. Я хочу добавить значения этих столбцов в df1, используя идентификаторы, чтобы получить следующую таблицу:

out<-read.table(text="id Group Location Class Garden
1121	B	O1	Y	O11
1141	M	O4	N	V19
1196	K	O3	N	N20
1166	P	O9	N	A11",header=TRUE) 

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Я думаю, что вы хотите функцию merge(). Сначала вы можете связать два кадра данных вместе, а затем объединить.

df4 <- rbind(df2, df3)

df1 <- merge(df1, df4, by = "id")

output

  id Group Location Cup Class Garden
1 1121     B       O1   4     Y    O11
2 1141     M       O4   1     N    V19
3 1166     P       O9   3     N   GH12
4 1166     P       O9   3     N    A11
5 1196     K       O3   8     N    N20

by = указывает, какой столбец объединить, и столбцы объединяются из двух входов.

0 голосов
/ 03 марта 2020

Мы можем связать data.frames с помощью bind_cols (после преобразования столбцов factor в character), удалить столбец 'Cup', filter строки, в которых 'id' из 'df1' только присутствующие, сгруппированные по 'id', summarise строки, чтобы иметь одну строку не-NA элемента и вырезать last строку

library(dplyr)
bind_rows(df1, df2, df3) %>%
   select(-Cup) %>% 
   filter(id %in% df1$id) %>% 
   group_by(id) %>% 
   summarise_at(vars(-group_cols()), ~ if(all(is.na(.))) NA 
        else 
           last(na.omit(.))) 
# A tibble: 4 x 5
# Groups:   id [4]
#     id Group Location Class Garden
#  <int> <fct> <fct>    <chr> <chr> 
#1  1121 B     O1       Y     O11   
#2  1141 M     O4       N     V19   
#3  1166 P     O9       N     A11   
#4  1196 K     O3       N     N20   

данные

df1[2:3] <- lapply(df1[2:3], as.character)
df2[3:4]  <- lapply(df2[3:4], as.character)
df3[3:4] <- lapply(df3[3:4], as.character)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...