【问题标题】:How to 'summarize' variable which mixed by 'numeric' and 'character'如何“汇总”由“数字”和“字符”混合的变量
【发布时间】:2022-01-17 19:14:28
【问题描述】:

这里是data.frame data 如下,如何转移到wished_data 谢谢!

library(tidyverse)
data <- data.frame(category=c('a','b','a','b','a'),
                      values=c(1,'A','2','4','B'))

#below code can't work
data %>% group_by(category ) %>% 
  summarize(sum=if_else(is.numeric(values)>0,sum(is.numeric(values)),paste0(values)))
  
#below is the wished result
wished_data <- data.frame(category=c('a','a','b','b'),
           values=c('3','B','A','4'))

【问题讨论】:

  • 为什么是wished_data[[4,2]]==4?

标签: r dataframe tidyverse


【解决方案1】:

这里的回答有点乱,

library(dplyr)

bind_rows(data %>% 
            filter(is.na(as.numeric(values))), 
          data %>% 
            mutate(values = as.numeric(values)) %>% 
            group_by(category) %>% 
            summarise(values = as.character(sum(values, na.rm = TRUE)))) %>% 
         arrange(category)

   category values
#1        a      B
#2        a      3
#3        b      A
#4        b      4

【讨论】:

    【解决方案2】:

    我将创建一个单独的列,将 category 中的数值与字符分开分组。

    data %>%
      mutate(num_check = grepl("[0-9]", values)) %>%
      group_by(category, num_check) %>%
      summarize(sum = ifelse(
        unique(num_check),
        as.character(sum(as.numeric(values))),
        unique(values)
      ), .groups = "drop")
    #> # A tibble: 4 × 3
    #>   category num_check sum  
    #>   <chr>    <lgl>     <chr>
    #> 1 a        FALSE     B    
    #> 2 a        TRUE      3    
    #> 3 b        FALSE     A    
    #> 4 b        TRUE      4
    

    【讨论】:

      【解决方案3】:

      在列中混合数字和字符变量不是tidy。考虑为每种类型提供自己的列,例如:

      data %>%
        mutate(letters = str_extract(values, "[A-Z]"),
               numbers = as.numeric(str_extract(values, "\\d"))) %>%
        group_by(category) %>%
        summarise(values = sum(numbers, na.rm = T),
                  letters = na.omit(letters))
      
        category values letters
        <chr>     <dbl> <chr>  
      1 a             3 B      
      2 b             4 A  
      

      在 R 字符串数学中没有意义,"1+1" 不是"2",而is.numeric("1") 给出了FALSE。一种解决方法是转换为列表对象,或为每个对象提供自己的列。

      【讨论】:

        猜你喜欢
        • 2020-04-27
        • 1970-01-01
        • 2017-03-22
        • 2020-10-25
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多