【问题标题】:How do I get summary statistics in R after negative selection of a data frame在选择数据框后如何在 R 中获取汇总统计信息
【发布时间】:2016-07-08 12:28:12
【问题描述】:

我想否定选择(除因子变量的每个级别的给定行值之外的所有值)并总结剩余的数据。举个简单的例子,我有一个数据框 DF,它有两列。

>DF
Category      Value  
A               5  
B               2  
C               3  
A               1  
C               1

如果 dplyr 可以否定选择(可以吗?),它看起来像这样。

> DF %>% group_by(!Category) %>% summarise(avg = mean(Value))
!Category    avg
A            2.00               #average of all rows where category isn't A
B            2.50
C            2.67

【问题讨论】:

  • 使用group_by 无法完成您想要的操作,因为您将多次使用每个值,因此这不仅仅是按一个因素简单地拆分数据框。您将不得不使用更通用的方法自己编写代码,例如 lapplydplyr::do

标签: r dataframe dplyr


【解决方案1】:

另一种方法是使用 for 循环:

DF<-data.frame(Category=c("A","B","C","A","C"),
               Value=c(5,2,3,1,1))

DF2<-data.frame(Category=unique(DF$Category))

for(letter in unique(DF$Category)) {
        DF3<-DF[DF$Category!=letter,]
        DF2$avg[DF2$Category==letter]<-round(mean(DF3$Value),2)
}

DF2

  Category  avg
1        A 2.00
2        B 2.50
3        C 2.67

【讨论】:

  • 谢谢马里奥。这就是我的想法,但我试图尽可能避免在 R 中使用 for 循环......利用矢量化代码(速度和干净)。
【解决方案2】:

使用data.table我们可以试试:

library(data.table)
setDT(DF)[, DF[!Category %in% .BY[[1]], mean(Value)], by = Category]
#   Category       V1
#1:        A 2.000000
#2:        B 2.500000
#3:        C 2.666667

【讨论】:

  • dt[, dt[!.BY, mean(Value), on="Category"], by=Category]
  • mtoto,这当然有效,但我是 WRT data.table 的新手。我在 DataCamp 上完成了 DT 课程,但并没有真正强迫自己使用它。感谢您提供答案和开始使用 DT 的理由。
  • data.table 的主要优点是灵活性和速度。在这种情况下,data.table 解决方案比使用上述sapply 解决方案快大约 100 倍。
【解决方案3】:

这是您可以在基础R 中执行此操作的一种方法:

编辑:感谢@Ryan 提出可扩展更改的建议

> sapply(levels(DF$Category), FUN = function(x) mean(subset(DF, Category != x)$Value))

       A        B        C 
2.000000 2.500000 2.666667 

【讨论】:

  • 我会将c('A','B','C') 替换为levels(DF$Category)
  • 感谢您的建议
  • 或者如果Category是一个字符向量,你可以使用unique(df$Category)。如果他们想要 data.frame 作为回报,您可以将您的建议包含在 stack() 中。
  • 感谢输入 bouncyball 和 Ryan。最近我一直在用 dplyr 做很多事情,我陷入了这种思维模式。此解决方案有效且可读性强。
猜你喜欢
  • 2018-08-11
  • 2019-08-18
  • 2014-01-15
  • 2021-08-03
  • 2023-02-21
  • 2022-12-06
  • 2012-04-08
  • 2020-12-03
相关资源
最近更新 更多