【问题标题】:R - Manipulation of data frameR - 数据框的操作
【发布时间】:2021-06-26 00:59:10
【问题描述】:

我有以下数据框表

S/N Index 1 Index 2
A 5 5
B 5 2
C 2 4

如何将其更改为下表?

index 1 2 3 4 5
Index 1 0% 33.3% 0% 0% 66.6%
Index 2 0% 33.3% 0% 33.3% 33.3%

提前致谢!

【问题讨论】:

    标签: r dataframe group-by datatable aggregate


    【解决方案1】:

    您似乎想查看每个索引中每个值的计数比例。我花了几个步骤,但这是否大致产生了您正在寻找的东西?

    df1 <- data.frame("S_N" = c("A", "B", "C"),
                     "Index1" = c(5, 5, 2),
                     "Index2" = c(5, 2, 4))
    df1 <- df1 %>% 
      pivot_longer(names_to = "Index", values_to = "value", cols = c("Index1", "Index2"))
    
    df2 <- df1 %>% 
      group_by(Index) %>% 
      summarise(idx_cnt = n())
    
    final_df <- df1 %>% 
      group_by(Index, value) %>% 
      summarise(count = n()) %>% 
      left_join(df2, by = "Index") %>% 
      mutate(frac = count / idx_cnt * 100) %>% 
      select(Index, value, frac) %>% 
      pivot_wider(names_from = value, values_from = frac)
    

    结果:

    > final_df
    # A tibble: 2 x 4
    # Groups:   Index [2]
      Index    `2`   `5`   `4`
      <chr>  <dbl> <dbl> <dbl>
    1 Index1  33.3  66.7  NA  
    2 Index2  33.3  33.3  33.3
    

    【讨论】:

      【解决方案2】:

      janitor 的简单语法

      library(tidyverse)
      library(janitor)
      
      df1 %>% pivot_longer(-S_N) %>%
        tabyl(name, value) %>%
        adorn_percentages("row") %>%
        adorn_pct_formatting(digits = 2)
      
         name      2      4      5
       Index1 33.33%  0.00% 66.67%
       Index2 33.33% 33.33% 33.33%
      

      【讨论】:

      • 很高兴它有帮助。还请考虑upvoting 通常在 SO 上需要。对于每个问题,您可以为您认为对您有帮助的答案投票。
      【解决方案3】:

      在这里使用tidyverse 函数是一种方法。使用从@Carey Caginalp 共享的数据

      library(tidyverse)
      
      df1 %>%
        pivot_longer(cols = -S_N, names_to = 'index') %>%
        count(index, value) %>%
        group_by(index) %>%
        mutate(n = prop.table(n) * 100) %>%
        ungroup %>%
        complete(index, value = 1:max(value), fill = list(n = 0)) %>%
        pivot_wider(names_from = value, values_from = n)
      
      #  index    `1`   `2`   `3`   `4`   `5`
      #  <chr>  <dbl> <dbl> <dbl> <dbl> <dbl>
      #1 Index1     0  33.3     0   0    66.7
      #2 Index2     0  33.3     0  33.3  33.3
      

      【讨论】:

        猜你喜欢
        • 2021-06-28
        • 2021-06-28
        • 2015-09-19
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 2020-11-20
        • 2020-07-22
        • 2017-01-25
        相关资源
        最近更新 更多