Подтвердить что ты не робот

Получить столбцы по строке из data.table

raw - это data.table, и работает следующий код:

raw[,r_responseTime] #Returns the whole column
raw[,c_filesetSize]  #Same as above, returns column
plot(raw[,r_responseTime]~raw[,c_filesetSize]) #draws something

Теперь я хочу указать эти столбцы из строки, например, например:

col1="r_reponseTime"
col2="c_filesetSize"

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

raw[,col1] #Returns the whole column
raw[,col2]  #Same as above, returns column
plot(raw[,col1]~raw[,col2]) #draws something

Не работает, конечно, потому что мне нужно какое-то "разделение". Я не знал, что искать в помощи и в Интернете, поэтому извините за тупой вопрос.

4b9b3361

Ответ 1

Было бы неплохо, если бы вы предоставили воспроизводимый пример или, по крайней мере, показали, что такое имена столбцов raw и какие r_responseTime и c_filesetSize содержат. При этом get является вашей функцией разыменования, поэтому попробуйте:

raw[, get(col1)]
raw[, get(col2)]
plot(raw[, get(col1)] ~ raw[, get(col2)])

Ответ 2

Современный подход заключается в использовании ..:

raw[ , ..col1]

.. "ищет уровень", чтобы найти col1.


Более старая, менее предпочтительная альтернатива - использовать функцию match() или оператор %in%.

raw[, match(col1, names(raw)),with=FALSE]

Ответ 3

Если у вас есть вектор строк, вы можете использовать mget

cols = c("r_reponseTime", "c_filesetSize")
raw[, mget(cols)]

Ответ 4

К сожалению, "получить" может быть проблематично! Смотрите пример ниже:

m = 100
x1 = sample(c("cat", "dog", "horse"), m, replace=TRUE)
y1 = rnorm(m)
fill1 = sample(c("me", "myself", "dude"), m, replace=TRUE)
df = data.frame("x"=x1, "y"=y1, "fill"=fill1)
dt = data.table(df)

get не работает!

y = "y"
dt[ , get(y)]

получить работу!

yCol = "y"
dt[ , get(yCol)]

работает всегда, но это не красиво!

eval(parse(text = paste0("values = dt[ ,",  y, "]")))
eval(parse(text = paste0("values = dt[ ,",  yCol, "]")))