Удалить столбец по имени, используя [без присвоения имени фрейму данных / матричному объекту - PullRequest
0 голосов
/ 09 сентября 2018

@ Joris Meys отличный ответ на этот знаменитый вопрос предлагает отбрасывать столбцы по имени, используя список имен. Требуется предварительное присвоение имени фрейму / матрице данных с использованием names(df) или для матриц colnames(matrix).

Из любопытства я задался вопросом, возможна ли подобная стратегия, если сначала не присвоить имя фрейму / матрице данных. Я размышлял над этим фактом , отвечая на этот вопрос (откуда я взял свои образцы данных).

Мое предлагаемое решение оставляет столбец с select следующим образом:

bind_cols(split(df$b, df$year)) %>% select(-'1997')

Сначала я пытался использовать do.call(cbind, split(df$b, df$year)), но это дало матрицу, а dplyr::select не понравилось. Теперь я могу, конечно, выбрать положительно :

do.call(cbind, split(df$b, df$year))[,c('1996','1998')]

Я также мог бы использовать subset:

subset(do.call(cbind, split(df$b, df$year)), select = - `1997`)

Мой вопрос заключается в том, как использовать [ для «отрицательного выбора» по имени (здесь: отбрасывание 1997), без предварительного присвоения матрицы / фрейма данных, то есть в одной строке.


Данные

set.seed(77)
df <- data.frame(year = rep(1996:1998,3), a = runif(9), b = runif(9), e = runif(9))

# required result something like: (result from code above)   

          1996      1998
[1,] 0.4569087 0.9881951
[2,] 0.1658851 0.4475605
[3,] 0.3647157 0.7033574

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Это не выбирает столбцы по имени, но что, если вы сначала отфильтруете строки в split, используя [ для отрицательного выбора.

do.call(cbind, split(df[-which(df$year == 1997),"b"], df[-which(df$year == 1997), "year"]))
#>           1996      1998
#> [1,] 0.4569087 0.9881951
#> [2,] 0.1658851 0.4475605
#> [3,] 0.3647157 0.7033574

или, может быть, супер длинная однострочная для отрицательной индексации столбцов

do.call(cbind, split(df$b, df$year))[,-which(colnames(do.call(cbind, split(df$b, df$year))) == "1997")]
#>           1996      1998
#> [1,] 0.4569087 0.9881951
#> [2,] 0.1658851 0.4475605
#> [3,] 0.3647157 0.7033574

Хотя, вы можете сжать его трубкой

do.call(cbind, split(df$b, df$year)) %>%  .[,-which(colnames(.) == "1997")]
#>           1996      1998
#> [1,] 0.4569087 0.9881951
#> [2,] 0.1658851 0.4475605
#> [3,] 0.3647157 0.7033574
0 голосов
/ 09 сентября 2018

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

do.call(cbind, split(df$b, df$year))[,-which(df$year == '1997')[1]]

, что дает,

          1996      1998
[1,] 0.4569087 0.9881951
[2,] 0.1658851 0.4475605
[3,] 0.3647157 0.7033574

ПРИМЕЧАНИЕ 1: Ваш начальный кадр данных должен быть отсортирован по year

ПРИМЕЧАНИЕ 2: Вы можете использовать cbind.data.frame, чтобы получить выходные данные в виде фрейма данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...