Как отбросить все столбцы с одинаковыми именами (tidyverse или base R)? - PullRequest
1 голос
/ 24 июня 2019

В моем наборе данных есть несколько столбцов с одинаковыми именами, и я хотел бы их удалить.

К сожалению, select(data, -Offender) не работает (Error: Can't bind data because some arguments have the same name), но я также не могу использовать janitor::clean_names для преодоления этого - мне нужно, чтобы оставшиеся имена столбцов не изменились.

Я пытался использовать базу R (df1 <- subset(df1, select = -c(Offender))), но затем она переименовывает других нарушителей. #

Ответы [ 3 ]

4 голосов
/ 24 июня 2019

Вот базовое решение.

# Create data frame
df <- data.frame(runif(10), runif(10), runif(10), runif(10))
names(df) <- c("foo", "bar", "bar", "bar")

# Examine data
print(df)
#>          foo       bar       bar        bar
#> 1  0.4126322 0.1436917 0.4870304 0.80514914
#> 2  0.1642798 0.7948858 0.7741611 0.64353516
#> 3  0.6485090 0.6607900 0.9260459 0.75226835
#> 4  0.5254531 0.5535233 0.5746025 0.07131740
#> 5  0.1367792 0.4830001 0.4947695 0.46050685
#> 6  0.9517484 0.5750567 0.2231635 0.20050668
#> 7  0.9535626 0.1362335 0.5429668 0.07581875
#> 8  0.6679136 0.5017095 0.3106441 0.02235911
#> 9  0.4489072 0.3811038 0.1922099 0.07851105
#> 10 0.7724686 0.1284880 0.4240226 0.44462081

# Remove all columns called "bar"
df[, "bar" == names(df)] <- NULL

# Examine data again
print(df)
#>          foo
#> 1  0.4126322
#> 2  0.1642798
#> 3  0.6485090
#> 4  0.5254531
#> 5  0.1367792
#> 6  0.9517484
#> 7  0.9535626
#> 8  0.6679136
#> 9  0.4489072
#> 10 0.7724686

Создано в 2019-06-24 пакетом Представить (v0.3.0)

1 голос
/ 24 июня 2019

Я понял это, когда закончил набирать вопрос:

  1. Используйте базовую команду R df1 <- subset(df1, select = -Offender), чтобы переименовать все Offenders, оставив остальные столбцы без изменений.
  2. Тогда используйте select_at(vars(-starts_with("Offender"))) и Боб - ваш дядя.

Короче говоря:

df1 <- subset(df1, select = -Offender) %>%
  select_at(vars(-starts_with("Offender")))

По сути, база R не будет жаловаться, что столбцы имеют одинаковое имя, и тихо исправит это для вас. В этот момент вы можете tidyverse, насколько вам нравится.

0 голосов
/ 24 июня 2019

Если вы хотите удалить все столбцы с именем Offender, я думаю, что есть более простой и элегантный способ:

df2 <- df1 %>%
  dplyr::select(-starts_with("Offender"))

Если это не то, что вам нужно, возможно, минимальный пример поможет лучше проиллюстрировать то, что вы пытаетесь сделать.

...