R странное поведение со столбцами data.table и grep - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь построить rowMeans для подмножества столбцов таблицы данных.Код работает, если используется фрейм данных, но не как таблица данных.Зачем?

Минимальный пример - приведенный ниже код не производит вывод 10x10:

IDnum <- c(101:110)
Name <- LETTERS[seq( from = 1, to = 10 )]
minExample <- as.data.table(replicate(10,sample(0:5,10,rep=TRUE)))
minExample <- cbind(IDnum, Name, minExample)
grep("V",names(minExample))
#-- Intermediate output omitted

minExample[ , grep("V", names(minExample))]
[1]  3  4  5  6  7  8  9 10 11 12

Но это дает правильный вывод (10x10):

minExample[ , 3:12]

Однакопреобразование во фрейм данных снова приводит к ожидаемому поведению:

minExample2 <- as.data.frame(minExample)
grep("V", names(minExample2))
minExample2[ , grep("V",names(minExample2))]

Row V1 V2 V3 V4 V5 V6 V7 V8 V9  V10
1   2  3  5  5  1  3  2  1  3   1
2   4  3  0  1  5  3  0  5  2   3
3   1  2  0  2  2  4  4  0  4   0
4   3  4  5  4  0  0  2  0  0   3
5   2  2  4  4  5  2  1  4  2   2
6   5  3  3  1  1  2  0  5  1   4
7   4  2  2  0  3  1  4  0  5   1
8   0  4  3  2  2  2  2  0  3   5
9   4  3  3  5  4  1  2  0  5   0
10  5  5  0  3  4  4  0  0  1   5

Почему расхождение?

1 Ответ

0 голосов
/ 12 июня 2018
minExample[ , grep("V", names(minExample)), with = FALSE]

Что касается того, почему это так, проверьте первую запись в документации пакета data.table и обсуждение там аргумента with.По умолчанию with=TRUE означает, что выражения в позиции j рассматриваются как переменные в data.table.Если вы укажете with=FALSE, вы будете рассматривать их как вектор имен столбцов.В вашем синтаксисе вы указали символьный вектор для позиции j.Это символы, а не переменные (в data.table), и поэтому они не распознаются.Это та же самая причина, по которой A=2 тогда A+5 работает, а A=2, "A" + 5 - нет.

...