R - Как использовать символьную переменную в качестве имени столбца во встроенной записи данных.table [duplicate]

Как вы относитесь к переменным в data.table, если имена переменных хранятся в символьном векторе? Например, это работает для data.frame:

df <- data.frame(col1 = 1:3)
colname <- "col1"
df[colname] <- 4:6
df
#   col1
# 1    4
# 2    5
# 3    6

Как я могу выполнить эту же операцию для таблицы данных, либо с нотной записью :=, либо без нее? Очевидная вещь dt[ , list(colname)] не работает (и я этого не ожидал).

61
задан 19 March 2016 в 16:33

2 ответа

* Это не ответ на самом деле, но у меня нет достаточного количества уличных отзывов для комментариев: /

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

colname <- as.name("users")
# Google Analytics query is run with chosen metric and resulting data is assigned to DT
DT2 <- DT[, sum(eval(colname, .SD)), by = country]
setnames(DT2, "V1", as.character(colname))

Обратите внимание, что я могу ссылаться на него просто отлично в sum (), но, похоже, не может его назначить в тот же шаг. BTW, причина, по которой мне нужно это сделать, это colname будет основываться на вводе пользователя в приложении Shiny.

7
ответ дан 15 August 2018 в 16:19
  • 1
    +1 для просто работы: я согласен, что это не должно быть «способ». чтобы сделать это, но, проведя всего 45 минут, перелистывая каждую публикацию на эту тему, это единственное решение, на которое я действительно смог поработать - спасибо, что потратили время, чтобы указать на это! – neuropsych 25 January 2016 в 01:39
  • 2
    Рад, что смог помочь! К сожалению, я никогда не находил более элегантное решение, напрямую использующее data.tables, хотя этот 3-х слой не страшен. В моем сценарии я понял, что более простой альтернативой было бы использование tidyr, чтобы просто сделать мои данные «длинными». вместо «широко», поскольку, основываясь на пользовательском вводе, я всегда мог фильтровать один столбец, а не выбирать из набора столбцов. – efh0888 26 January 2016 в 01:27
  • 3
    Небезопасно предположить, что V1 - это новое имя. Например, если вы прочитали csv с fread и есть неназванный столбец, у него будет имя V1 (и read.csv даст X). Так что, возможно, у вашей таблицы уже есть V1. Возможно, просто введите имя names(DT)[length(names(DT))] – dracodoc 10 August 2016 в 22:45

Для нескольких столбцов и функции, применяемой к значениям столбца.

При обновлении значений из функции RHS должен быть объектом списка, поэтому использование цикла .SD с lapply сделает трюк.

Пример ниже преобразует целочисленные столбцы в числовые столбцы

a1 <- data.table(a=1:5, b=6:10, c1=letters[1:5])
sapply(a1, class)  # show classes of columns
#         a           b          c1 
# "integer"   "integer" "character" 

# column name character vector
nm <- c("a", "b")

# Convert columns a and b to numeric type
a1[, j = (nm) := lapply(.SD, as.numeric ), .SDcols = nm ]

sapply(a1, class)
#         a           b          c1 
# "numeric"   "numeric" "character" 
2
ответ дан 15 August 2018 в 16:19

Другие вопросы по тегам:

Похожие вопросы: