【问题标题】:Arranging the Dataset in R as per Sum value根据 Sum 值在 R 中排列数据集
【发布时间】:2018-03-28 10:36:40
【问题描述】:

请运行下面的 R 代码,我希望使用下面的数据获得一个数据集,其中“品牌”和“糖果”列值出现一次,相应的时间值是所有此类情况的总和。为了说明,我希望前两个值“Mars”和“A”只出现一次,它们的总和“22”出现在下一列中。其余的类似,该命令也应该快速处理大数据。谢谢,请帮忙。

PlanetData <- read.table(
text = "
Brand       Candy                time
Mars        A                    10
Mars        A                    12
Jupiter     B                    13     
Jupiter     B                    14 
Saturn      C                    21
Saturn      C                    26",          
header = TRUE,
stringsAsFactors = FALSE)

【问题讨论】:

  • aggregate(PlanetData$time, list(PlanetData$Brand, PlanetData$Candy), sum)
  • @LAP,感谢您的帮助。但是,该命令会在大数据上快速运行吗?
  • 你试试@RobertJ,如果没有,你会学习并行编程:-)
  • 您的数据有多大? 50k 行还是 3000 万行?
  • @LAP,可能以百万计

标签: r group-by dplyr plyr


【解决方案1】:

您可以尝试两种替代流程,使用dplyrdata.table 并选择最快的一个:

PlanetData <- read.table(
  text = "
  Brand       Candy                time
  Mars        A                    10
  Mars        A                    12
  Jupiter     B                    13     
  Jupiter     B                    14 
  Saturn      C                    21
  Saturn      C                    26",          
  header = TRUE,
  stringsAsFactors = FALSE)


library(dplyr)

PlanetData %>% group_by(Brand, Candy) %>% summarise(SUM = sum(time)) %>% ungroup()

# # A tibble: 3 x 3
#    Brand   Candy   SUM
#   <chr>   <chr> <int>
# 1 Jupiter B        27
# 2 Mars    A        22
# 3 Saturn  C        47


library(data.table)

setDT(PlanetData)[, .(SUM=sum(time)),by=.(Brand, Candy)]

#       Brand Candy SUM
# 1:    Mars     A  22
# 2: Jupiter     B  27
# 3:  Saturn     C  47

使用stringsAsFactors = TRUE 尝试dplyr 版本也很有用。它很可能(稍微?)更快。这取决于您拥有多少行和唯一值。

注意,当您使用 setDT(PlanetData) 时,PlanetData 将变为 data.table 而不是 data.frame。当您返回运行 dplyr 版本时,请确保这不会影响您的时间安排。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多