【发布时间】:2017-05-22 20:32:01
【问题描述】:
假设我有一个 data.table
library(data.table)
dt <- data.table(term = c('dog', 'cat', 'fish', 'dog', 'cat', 'fish',
'dog', 'cat', 'fish', 'dog', 'cat', 'fish',
'dog', 'cat', 'fish', 'dog', 'cat', 'fish'),
eats = c(1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1, 2, 3, 3, 3, 3, 3, 3),
weights = c(6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 2, 2, 2, 2, 2, 2))
然后我创建一个函数来执行他们吃的东西和他们的体重之间的关联,并返回给定宠物的结果:
foo <- function(pet, dtSrc){
newDt <- dtSrc[term == pet, c('eats', 'weights')]
corTotal <- Hmisc::rcorr(as.matrix(newDt), type = 'pearson')
corValues <- corTotal$r[1, 2]
return(corValues)
}
我可以通过 foo 函数运行每只宠物的食物和体重之间的相关性。使用 sapply,我可以做这样的事情:
pets <- unique(dt$term)
dtResult <- sapply(pets, foo, dtSrc = dt)
dtResult <- as.data.table(dtResult, keep.rownames = TRUE)
colnames(dtResult) <- c('pet', 'cor')
结果是完美的。我为每只宠物获得一行
pet cor
1: dog -0.8696263
2: cat -0.8215838
3: fish -0.7364854
但如果我还想将 p 值数据添加到每一行,这样我就可以获得如下所示的结果:
pet cor pv
1: dog -0.8696263 0.02438794
2: cat -0.8215838 0.04490880
3: fish -0.7364854 0.09501072
我想我可以将 p 值添加到相关性中,可能是这样的:
fooMore <- function(pet, dtSrc){
newDt <- dtSrc[term == pet, c('eats', 'weights')]
corTotal <- Hmisc::rcorr(as.matrix(newDt), type = 'pearson')
corValues <- corTotal$r[1, 2]
pValues <- corTotal$P[1, 2]
result <- c(corValues, pValues)
return(result)
}
pets <- unique(dt$term)
dtResult <- sapply(pets, fooMore, dtSrc = dt)
dtResult <- as.data.table(dtResult, keep.rownames = TRUE)
colnames(dtResult) <- c('pet', 'cor', 'pv')
不幸的是,结果看起来与以前完全不同。特别是,我没有得到我需要的行名:
pet cor pv
[1,] -0.86962634 -0.8215838 -0.73648536
[2,] 0.02438794 0.0449088 0.09501072
修改上面的代码以生成我正在寻找的结果的最 R-ish 方式是什么? TIA
【问题讨论】:
-
执行此操作的 data.table 方法是:
dt[, .(eats=sum(eats), weights=mean(weights)), by = term]. -
你是对的,不幸的是,在我的“真实”世界情况下,我需要使用其中一个应用函数。长话短说 - 我有来自各种传感器的测量结果,并在数千种不同的排列中运行相关性。我发回相关值并希望包含相应的 p 值,但额外的值会导致此问题。我可以单独运行 p 值,但希望避免额外的开销,因此采用了这种方法。
标签: r data.table sapply