R语言 使用`data.table`的DT[ i,j,by]时,是否可以事先设置列类型?

bejyjqdl  于 2023-04-03  发布在  其他
关注(0)|答案(2)|浏览(107)

我试图计算多个不同组的两个变量之间的相关性(例如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']的任何情况下列类型是什么?

tvz2xvvm

tvz2xvvm1#

如果您想保留所有列,而不是删除具有NULL的列,您可以手动设置'problem'列的类(在这种情况下,给出问题的列是“parameter”)。如果列确实包含某些组的值而不是其他组的值,则这比删除NULL更可取。

DT[, {
  res <- cor.test(Sepal.Length, Sepal.Width, method = 'spearman')
  class(res$parameter) <- 'integer'
  res
  }, Species]

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

sr4lhrrt2#

在我看来,错误msg实际上是相当不言自明的:

**第一个组的j的结果的第2列为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元素

相关问题