【问题标题】:How to preserve row structure from sapply when adding multiple values添加多个值时如何从 sapply 中保留行结构
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 2023-04-04
    • 2023-03-15
    • 2016-05-18
    • 2021-12-17
    • 2019-12-16
    • 2022-07-19
    • 1970-01-01
    相关资源
    最近更新 更多