Как я могу отфильтровать новый фрейм данных в зависимости от столбцов, существующих в другом фрейме данных?

#r #dplyr

Вопрос:

Итак, у меня есть два кадра данных.

df1 :

    Date Bond2 Bond3 Bond5 Bond6 Bond7 Bond8 Bond10 Bond11 Bond12 Bond14 Bond15 Bond16 Bond17
1 41275    NA    NA    NA    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
2 41276    NA    NA    NA    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
3 41277    NA    NA    NA    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
4 41278    NA    NA    NA    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
5 41279    NA    NA    NA    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
 

df1 :

    Date Bond2 Bond3 Bond4 Bond5 Bond6 Bond7 Bond8 Bond10 Bond11 Bond12 Bond14 Bond16 Bond17 Bond19
1 41275    NA    NA    NA    NA    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
2 41276    NA    NA    NA    NA    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
3 41277    NA    NA    NA    NA    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
4 41278    NA    NA    NA    NA    NA    NA    NA     NA     NA     NA     NA     NA     NA     NA
 

Я хочу создать новый df3 df1 , в котором содержатся все столбцы df2 , а затем a df4 df2 , в котором содержатся все столбцы df1 .

Я думал в направлении filter(df1, names() %in% names(df2)) или select(names(df1) %in% names(df2) , но ни то, ни другое не работает.

Спасибо

Комментарии:

1. Не могли бы вы предоставить воспроизводимые данные, используя dput()

2. Привет @Macosso, но я это сделал?

Ответ №1:

Мы можем использовать intersect имена столбцов из «df1″, » df2 » и использовать их для подмножества столбцов из df1, df2 для создания df3, df4 соответственно

 nm1 <- intersect(names(df1), names(df2))
df3 <- df1[nm1]
df4 <- df2[nm1]
 

Ответ №2:

Если вы хотите придерживаться тидира, одним из способов было бы:

 df3 <- df1 %>% select(any_of(names(df2))
df4 <- df2 %>% select(any_of(names(df1))
 

Комментарии:

1. Я думаю, что это больше dplyr , чем tidyr . 😉

2. Спасибо. Я попробовал это, однако я получаю ошибку Error: Can't subset columns that don't exist. x Columns Bond4 , Bond19 , Bond23 , Bond24 , Bond25 , etc. don't exist.

3. Я только что отредактировал код. any_of вместо all_of того, чтобы делать. Кстати, лучше, если вы опубликуете воспроизводимый набор данных в своем вопросе.