R dplyr подмножество с отсутствующими столбцами - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть следующий код, и я хотел бы выбрать столбцы в новый data.frame.

library(dplyr)
df = data.frame(
    Manhattan=c(1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0), 
    Brooklyn=c(0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0), 
    The_Bronx=c(1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0), 
    Staten_Island=c(0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0), 
    "2012"=c("P", "P", "P", "P", "P", "P", "P", "P", "P", "P", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q"), 
    "2013"=c("P", "P", "P", "P", "P", "P", "P", "P", "Q", "Q", "P", "P", "P", "P", "Q", "Q", "Q", "Q", "Q"), 
    "2014"=c("P", "P", "P", "Q", "Q", "P", "P", "Q", "Q", "Q", "Q", "Q", "P", "Q", "P", "P", "P", "Q", "Q"), 
    "2015"=c("P", "P", "P", "P", "P", "Q", "Q", "Q", "P", "Q", "P", "P", "Q", "Q", "Q", "Q", "Q", "Q", "Q"), check.names=FALSE)
df2 <- subset(df, select = c("Manhattan", "Queens", "The_Bronx"))

Это выдает ошибку:

Error in [.data.frame`(x, r, vars, drop = drop) : 
   undefined columns selected

Поскольку столбец "Queens" отсутствует от df. Как я могу переопределить ошибку, чтобы R продолжал создавать df2 только со столбцами «Manhattan» и «The_Bronx»?

Очень важно: мои реальные данные имеют сотни столбцов, поэтому их невозможно выполнить вручную удалите столбцы, такие как «Queens», из команды df2 <- subset(df, select = c("Manhattan", "Queens", "The_Bronx")) (разве для этого есть хитрость?). Есть ли способ решить это? Спасибо.

Ответы [ 3 ]

1 голос
/ 11 апреля 2020

Мы могли бы также сделать

cols <- c("Manhattan", "Queens", "The_Bronx")
library(dplyr)
df %>%
   select(matches(str_c(cols, collapse="|")))
1 голос
/ 15 апреля 2020

A tidyverse реализация будет:

df2 <- select(df, any_of(cols))

1 голос
/ 11 апреля 2020

В базе R вы можете использовать intersect, чтобы выбрать только имена, которые присутствуют.

cols <- c("Manhattan", "Queens", "The_Bronx")
subset(df, select = intersect(names(df), cols))

#   Manhattan The_Bronx
#1          1         1
#2          1         1
#3          0         0
#4          1         0
#5          1         0
#6          1         0
#7          1         0
#8          0         0
#...
#....

Или используйте any_of in dplyr:

library(dplyr)
df %>% select(tidyselect::any_of(cols))
...