Выбор непоследовательных столбцов по имени в data.table r - PullRequest
1 голос
/ 08 мая 2020

У меня есть база данных на моем диске, и я хотел бы выбрать несколько столбцов, используя :, иногда в data.table, используя имена столбцов.

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

Пример будет примерно таким:

library(gapminder)
data(gapminder)
setDT(gapminder)

names(gapminder) # [1] "country"   "continent" "year"      "lifeExp"   "pop"       "gdpPercap"

# I would like to select columns from `country` to `year` and pop

gapminder[,country:year] # this one works



gapminder[,country:year + pop] # doesn't work
gapminder[,c(country:year,pop)] # doesn't work either

gapminder[,.SD, .SDcols = c(country:year,pop)] # doesn't work

Я ломаю голову над этим. Буду признателен за любые предложения.

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

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

gapminder[, c(.SD, .(pop=pop)), .SDcols=country:year] 

Или, если у вас больше столбцов,

cols <- setNames(c("pop", "lifeExp"), c("pop", "lifeExp"))
gapminder[, c(.SD, mget(cols)), .SDcols=country:year] 

вывод:

          country continent year      pop lifeExp
   1: Afghanistan      Asia 1952  8425333  28.801
   2: Afghanistan      Asia 1957  9240934  30.332
   3: Afghanistan      Asia 1962 10267083  31.997
   4: Afghanistan      Asia 1967 11537966  34.020
   5: Afghanistan      Asia 1972 13079460  36.088
  ---                                            
1700:    Zimbabwe    Africa 1987  9216418  62.351
1701:    Zimbabwe    Africa 1992 10704340  60.377
1702:    Zimbabwe    Africa 1997 11404948  46.809
1703:    Zimbabwe    Africa 2002 11926563  39.989
1704:    Zimbabwe    Africa 2007 12311143  43.487
2 голосов
/ 08 мая 2020

Я не уверен, есть ли действительно простое решение этой проблемы в data.table, но, возможно, вы могли бы cbind диапазон столбцов с отдельным именем столбца.

library(data.table)
cbind(gapminder[,country:year], gapminder[, 'pop'])

Однако ваше желаемое поведение возможно в dplyr.

library(dplyr)
gapminder %>% select(country:year, pop)


#       country continent year      pop
#1: Afghanistan      Asia 1952  8425333
#2: Afghanistan      Asia 1957  9240934
#3: Afghanistan      Asia 1962 10267083
#4: Afghanistan      Asia 1967 11537966
#5: Afghanistan      Asia 1972 13079460
#6: Afghanistan      Asia 1977 14880372
...