【问题标题】:R: Dataframe Manipulation (group_by/aggregate) [duplicate]R:数据帧操作(group_by/aggregate)[重复]
【发布时间】:2021-10-01 13:39:45
【问题描述】:

我有如下数据框,如下图

Code Type Fee
AA JSON 10
AA R 20
AA R 10
DD PYTHON 30
DD JSON 15
ZZ R 50
ZZ PYTHON 60
ZZ PYTHON 10
code = c(rep("AA",3), rep("DD",2), rep("ZZ",3))
Type = c("JSON", "R", "R", "PYTHON", "JSON", "R", "PYTHON", "PYTHON")
Fee = c(10,20,10,30,15,50,60,10)
Price = as.data.frame(cbind(code, Type, Fee)); Price$Fee = as.integer(as.character(Price$Fee))

我想将数据框更改为如下所示的数据框,并相应地汇总费用

JSON R PYTHON
AA 10 30 0
DD 15 0 30
ZZ 0 50 70

提前致谢!

【问题讨论】:

  • 如果你使用Price = data.frame(code, Type, Fee)来构造数据框,你就不需要Price$Fee = as.integer(as.character(Price$Fee))
  • 仅供参考,除了删除问题的内容之外,还有一些机制可以解决已经提出问题的问题,这就是我回滚您的编辑的原因

标签: r dataframe group-by aggregate data-manipulation


【解决方案1】:

我们把data.frame从长变成宽,id_cols是code(因为它在行中),列名取自Type列,最后取值取自@ 987654323@.

由于存在重复,我们需要一种方法来求和值(例如 ZZ python 出现两次),我们使用sum 函数。

最后,我们删除NAs 并将它们替换为0。

 library(tidyvesre) 

> new_dat <- Price %>% pivot_wider(id_cols = code, names_from = Type, 
                                   values_from = Fee, values_fn = sum, values_fill = 0)

# A tibble: 3 x 4
  code   JSON     R PYTHON
  <chr> <int> <int>  <int>
1 AA       10    30      0
2 DD       15     0     30
3 ZZ        0    50     70

【讨论】:

    【解决方案2】:

    您可以从tidyr 使用pivot_wider -

    tidyr::pivot_wider(Price, names_from = Type, values_from = Fee, 
                       values_fn = sum, values_fill = 0)
    
    #  code   JSON     R PYTHON
    #  <chr> <int> <int>  <int>
    #1 AA       10    30      0
    #2 DD       15     0     30
    #3 ZZ        0    50     70
    

    还有data.table dcast -

    library(data.table)
    
    dcast(setDT(Price), Type ~ code, value.var = 'Fee', fun.aggregate = sum)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 2021-04-17
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      • 2017-01-25
      相关资源
      最近更新 更多