Подмножество data.table переменной (когда varname идентично colname) - PullRequest
0 голосов
/ 24 сентября 2018

Как я могу создать подмножество data.table с помощью переменной, если имя переменной совпадает с именем существующего столбца в data.table?Он работает с get("varname",pos = 1), но есть ли более надежное / гибкое решение?

library(data.table)

my_data_frame <- data.frame(
"V1"=c("A","B","C","A"),
"V2"=c(1, 2, 3, 4),
stringsAsFactors = FALSE        
)

V1 <- "A"

my_data_table <- as.data.table(my_data_frame)

# Can I improve this a bit? I want rows where V1 == "A", but use V1 in the statement 
my_data_table[ my_data_table$V1 == get("V1", pos = 1), ]

Переименование V1 не вариант.

ОБНОВЛЕНИЕ: я не считаю это 100% дубликатом.Принятый ответ на этот вопрос не приемлем для моего вопроса, поскольку в нем используется явный get, который я не хочу использовать, как указано в комментариях.

Ответы [ 3 ]

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

Если вы не возражаете сделать это в 2 этапа, вы можете просто вывести часть из области действия data.table (хотя обычно это не то, что вы хотите делать при работе с ...):

wh_v1 <- my_data_table[, V1]==V1
my_data_table[wh_v1]
#   V1 V2
#1:  A  1
#2:  A  4
0 голосов
/ 24 сентября 2018

Для условий равенства вы можете использовать объединение:

mDT = data.table(V1)
my_data_table[mDT, on=.(V1), nomatch=0]
#    V1 V2
# 1:  A  1
# 2:  A  4

Неявно, условие объединения в x[i, on=.(V1)] равно

V1 == V1

где LHS происходит от x и RHS от i.Это похоже на поиск каждой строки i в x.nomatch=0 означает, что любое значение, найденное в i, но не x, удаляется из вывода ... например

mDT2 = data.table(V1 = c("A", "D"))
my_data_table[mDT2, on=.(V1)]
#    V1 V2
# 1:  A  1
# 2:  A  4
# 3:  D NA

my_data_table[mDT2, on=.(V1), nomatch=0]
#    V1 V2
# 1:  A  1
# 2:  A  4
0 голосов
/ 24 сентября 2018

Вот решение, использующее library(tidyverse):

library(data.table)
library(tidyverse)
my_data_frame <- data.frame(
  "V1"=c("A","B","C","A"),
  "V2"=c(1, 2, 3, 4),
  stringsAsFactors = FALSE        
)

V1 = "A"
my_data_table <- as.data.table(my_data_frame)
df = my_data_table %>% filter(V1 == !!get("V1")) #you do not have to specify pos = 1

Если вы хотите, чтобы R использовал объект с именем "V1", вы можете сделать это

V1 = "A"
list_test = split(my_data_table, as.factor(my_data_table$V1)) #create a list for each factor level of the column V1.
df = list_test[[V1]] #extract the desired dataframe from the list using the object "V1"

Это что?хочешь?

...