подмножество кадра данных на основе имен столбцов с использованием «:» (пример: столбец подмножества B и столбец D до F) - PullRequest
2 голосов
/ 11 февраля 2020

У меня есть широкая таблица данных со многими столбцами (50 +)

Упрощенный пример (с 5 столбцами):

dt <- data.table(A = 1:10, B = 1, C = 1, D = 1, E = 1, F = 1, G = 1)

Теперь я хочу подмножество столбцов B и столбец D до F .

В случае, если я хотел только D до F, я мог бы сделать так:

dt[, D:F]

Однако я хотел бы сохранить столбец B. Я мог бы достичь желаемого результата на долгом пути, но это то, чего я пытаюсь избежать:

dt[, c("B", "D", "E", "F")]

Мой вопрос заключается в том, можно ли использовать следующий синтаксис, который, очевидно, не работает:

dt[, c("B", D:F)]

Помните, что это упрощенный пример, и «не выбрав A, C, G» не решит мою проблему.

Мне было интересно об этой проблеме. Я понимаю, что всегда могу решить эту проблему очень долго, но я хотел бы знать, есть ли быстрый способ, так как я часто сталкиваюсь с проблемой.

Большое спасибо за любые ответы!

Ответы [ 4 ]

5 голосов
/ 11 февраля 2020

В base вы можете использовать subset для выбора столбцов B и D: F.

subset(x, select = c(B, D:F))
#   B D E F
#1  1 1 1 1
#2  1 1 1 1
#3  1 1 1 1
#4  1 1 1 1
#5  1 1 1 1
#6  1 1 1 1
#7  1 1 1 1
#8  1 1 1 1
#9  1 1 1 1
#10 1 1 1 1

Это также будет работать с data.table, где cbind также может использовать как:

cbind(dt[,"B"], dt[, D:F])

Или вы можете использовать match:

i  <- match(c("B", "D", "F"), colnames(x))
x[,c(i[1],i[2]:i[3])]

Данные:

x <- data.frame(A = 1:10, B = 1, C = 1, D = 1, E = 1, F = 1, G = 1)

library(data.table)
dt <- data.table(x)
4 голосов
/ 12 февраля 2020

Другой вариант:

dt[, c(.(A), .SD), .SDcols=D:F]

или использование mget вместе с .SDcols

dt[, c(mget(c("A", "C")), .SD), .SDcols=E:G]
3 голосов
/ 11 февраля 2020

Должно быть лучшее решение в чистом data.table, но в любом случае: Это работает (вроде)

library(data.table)
dt <- data.table(A = 1:10, B = 1, C = 1, D = 1, E = 1, F = 1, G = 1)
ind <- c("B", LETTERS[4:6])
dt[, ..ind]

     B D E F
  1: 1 1 1 1
  2: 1 1 1 1
  3: 1 1 1 1
  4: 1 1 1 1
  5: 1 1 1 1
  6: 1 1 1 1
  7: 1 1 1 1
  8: 1 1 1 1
  9: 1 1 1 1
 10: 1 1 1 1
3 голосов
/ 11 февраля 2020

Мы можем использовать select из dplyr, что делает это легко

library(dplyr)
library(data.table)      
dt %>% 
   select(B, D:F)
#    B D E F
# 1: 1 1 1 1
# 2: 1 1 1 1
# 3: 1 1 1 1
# 4: 1 1 1 1
# 5: 1 1 1 1
# 6: 1 1 1 1
# 7: 1 1 1 1
# 8: 1 1 1 1
# 9: 1 1 1 1
#10: 1 1 1 1

Или использовать это в []

dt[, select(.SD, B, D:F)]
...