При использовании DT [i, j, by] `data.table` можно ли задавать типы столбцов заранее? - PullRequest
1 голос
/ 21 ноября 2019

Я пытаюсь вычислить корреляцию между двумя переменными для нескольких разных групп (например, DT[, cor.test(var1, var2), group]). Это прекрасно работает, когда я использую cor.test(var1, var2, method = 'pearson'), но выдает ошибку, когда я использую cor.test(var1, var2, method = 'spearman').

library(data.table)
DT <- as.data.table(iris)

# works perfectly 
DT[,cor.test(Sepal.Length,Sepal.Width, method = 'pearson'), Species]
#       Species statistic parameter      p.value  estimate null.value
# 1:     setosa  7.680738        48 6.709843e-10 0.7425467          0
# 2:     setosa  7.680738        48 6.709843e-10 0.7425467          0
# 3: versicolor  4.283887        48 8.771860e-05 0.5259107          0
# 4: versicolor  4.283887        48 8.771860e-05 0.5259107          0
# 5:  virginica  3.561892        48 8.434625e-04 0.4572278          0
# 6:  virginica  3.561892        48 8.434625e-04 0.4572278          0
#    alternative                               method
# 1:   two.sided Pearson's product-moment correlation
# 2:   two.sided Pearson's product-moment correlation
# 3:   two.sided Pearson's product-moment correlation
# 4:   two.sided Pearson's product-moment correlation
# 5:   two.sided Pearson's product-moment correlation
# 6:   two.sided Pearson's product-moment correlation
#                       data.name  conf.int
# 1: Sepal.Length and Sepal.Width 0.5851391
# 2: Sepal.Length and Sepal.Width 0.8460314
# 3: Sepal.Length and Sepal.Width 0.2900175
# 4: Sepal.Length and Sepal.Width 0.7015599
# 5: Sepal.Length and Sepal.Width 0.2049657
#> 6: Sepal.Length and Sepal.Width 0.6525292

# error
DT[,cor.test(Sepal.Length,Sepal.Width, method = 'spearman'), Species]
# Error in `[.data.table`(DT, , cor.test(Sepal.Length, Sepal.Width, method = "spearman"), : 
# Column 2 of j's result for the first group is NULL. We rely on the column types of the first 
# result to decide the type expected for the remaining groups (and require consistency). NULL 
# columns are acceptable for later groups (and those are replaced with NA of appropriate type 
# and recycled) but not for the first. Please use a typed empty vector instead, such as 
# integer() or numeric().

Вопрос:

Я знаю, что есть обходные пути дляэто конкретный пример, но можно заранее сказать data.table, какими будут типы столбцов для любого случая, использующего DT[i,j,by = 'something']?

1 Ответ

1 голос
/ 21 ноября 2019

На мой взгляд, ошибка msg на самом деле не требует пояснений:

Столбец 2 результата j для первой группы равен NULL. Мы полагаемся на типы столбцовпервого результата, чтобы определить тип, ожидаемый для оставшихся групп (и требуют согласованности). Столбцы NULL приемлемы для более поздних групп (и они заменены на NA соответствующего типа и переработаны), но не для первой. Вместо этого используйте типизированный пустой вектор, такой как integer () или numeric ().

Возможно, вы захотите использовать для фильтрации NULL (но будьте осторожны, чтобы NULL-расположение было одинаковым для каждогоby:

DT[, Filter(Negate(is.null), cor.test(Sepal.Length,Sepal.Width, method = 'spearman')), Species]

вывод:

      Species statistic      p.value  estimate null.value alternative                          method                    data.name
1:     setosa  5095.097 2.316710e-10 0.7553375          0   two.sided Spearman's rank correlation rho Sepal.Length and Sepal.Width
2: versicolor 10045.855 1.183863e-04 0.5176060          0   two.sided Spearman's rank correlation rho Sepal.Length and Sepal.Width
3:  virginica 11942.793 2.010675e-03 0.4265165          0   two.sided Spearman's rank correlation rho Sepal.Length and Sepal.Width

См. R: удаление элементов NULL из списка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...