添加多个值时如何保留应用的行结构

How to preserve row structure from sapply when adding multiple values

假设我有一个 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))

然后我创建了一个函数来执行他们吃的东西和他们的体重之间的相关性以及 return 给定宠物的结果:

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

由于我所能得到的只是反对票(该死!这太苛刻了)我将 post 解决方法,尽管我欢迎更好的解决方案。如您所见,我只是简单地组合这些值,然后再将它们分开。丑陋,但至少我不必 运行 同样的操作两次。

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]
  resultBoth <- paste0(corValues, ':', pValues) # combine results
  return(resultBoth)
}

pets <- unique(dt$term)
dtResult <- sapply(pets, fooMore, dtSrc = dt)
dtResult <- as.data.table(dtResult, keep.rownames = TRUE)
dtResult[, c('corValue', 'pValue') := tstrsplit(dtResult, ":", fixed=TRUE)]  # split them back out
dtResult$corValue <- as.numeric(dtResult$corValue)
dtResult$pValue <- as.numeric(dtResult$pValue)
dtResult$dtResult <- NULL
# just to be consistent with earlier
colnames(dtResult) <- c('pet', 'cor', 'pv')

    pet        cor         pv
1:  dog -0.8696263 0.02438794
2:  cat -0.8215838 0.04490880
3: fish -0.7364854 0.09501072