【问题标题】:Sum rows with specific criteria in r在 r 中对具有特定条件的行求和
【发布时间】:2018-06-25 13:38:00
【问题描述】:

我的数据是

               function  person
1                hr       1
2                sls      5
3                mktg     3
4                qlt      7
5                rev      5

我想使用 r 编程将“函数”列中的值总和设为“sls”和“mktg”

想要的输出是:

            Person     function
1             1         hr
2             8         sls & mktg
3             7         qlt
4             5         rev 

【问题讨论】:

  • 是列函数字符串吗?

标签: r dataframe data-science data-manipulation


【解决方案1】:

基础 R 解决方案:

merg <- c("sls", "mktg")
dat$func[dat$func %in% merg] <- paste(merg, collapse = " & ")
aggregate(person ~ func, dat, sum)
        func person
1         hr      1
2        qlt      7
3        rev      5
4 sls & mktg      8

数据

dat <- data.frame(
  func = c("hr", "sls", "mktg", "qlt", "rev"), 
  person = c(1, 5, 3, 7, 5),
  stringsAsFactors = FALSE
)

请注意,这假定dat$func 是一个字符...如果它不是首先转换为带有as.character() 的字符

【讨论】:

    【解决方案2】:
    library(dplyr)
    
    dat <- data.frame(func = c("hr", "sls", "mktg", "qlt", "rev"), 
                      person = c(1, 5, 3, 7, 5))
    
    dat %>%
      mutate(func = func %>% as.factor() %>% as.character(), 
             func = ifelse(func %in% c("sls", "mktg"), "sls & mktg", func)) %>%
      group_by(func) %>%
      summarize(Person = sum(person))
    

    返回

    # A tibble: 4 x 2
      func       Person
      <chr>       <dbl>
    1 hr              1
    2 qlt             7
    3 rev             5
    4 sls & mktg      8
    

    【讨论】:

      【解决方案3】:

      dplyr 的另一种方法:

      代码:
      dfr %>%
        group_by(Function = sub("sls|mktg", "sls & mktg", functn)) %>%
        summarise(Person = sum(person))
      
      输出:
      # A tibble: 4 x 2
        Function    Person
        <chr>       <dbl>
      1 hr             1.
      2 qlt            7.
      3 rev            5.
      4 sls & mktg     8.
      
      数据

      tringsAsFactors = TRUE|FALSE - 适用于两种情况。

      dfr <- data.frame(
        functn   = c("hr", "sls", "mktg", "qlt", "rev"), 
        person   = c(1, 5, 3, 7, 5)                    
      )
      

      【讨论】:

      • 这对我有用,因为我正在使用 dplyr 进行其他操作
      猜你喜欢
      • 2022-06-25
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 2014-09-30
      • 1970-01-01
      相关资源
      最近更新 更多