代码之家  ›  专栏  ›  技术社区  ›  abalter

对R dataframe使用pivot_wide而不是spread

  •  0
  • abalter  · 技术社区  · 5 年前

    我的理解是在某种程度上, pivot_wider(data, names_from, values_from) spread(data, key, value) . 我可没看到。

    library(tidyverse)
    
    df = data.frame(
      A = sample(letters[1:3], 20, replace=T), 
      B = sample(LETTERS[1:3], 20, replace=T)
    )
    
    df
    #>    A B
    #> 1  c B
    #> 2  b C
    #> 3  b B
    #> 4  b C
    #> 5  c C
    #> 6  b B
    #> 7  c B
    #> 8  b A
    #> 9  c A
    #> 10 b B
    #> 11 c B
    #> 12 b B
    #> 13 b A
    #> 14 c C
    #> 15 c C
    #> 16 a B
    #> 17 c C
    #> 18 b C
    #> 19 b A
    #> 20 a C
    
    df %>% count(A,B)
    #>   A B n
    #> 1 a B 1
    #> 2 a C 1
    #> 3 b A 3
    #> 4 b B 4
    #> 5 b C 3
    #> 6 c A 1
    #> 7 c B 3
    #> 8 c C 4
    
    df %>% count(A,B) %>% spread(key=B, value=n)
    #>    A B C
    #> 1 NA 1 1
    #> 2  3 4 3
    #> 3  1 3 4
    
    df %>% count(A,B) %>% pivot_wider(names_from=B, values_from=n)
    #> Error: Failed to create output due to bad names.
    #> * Choose another strategy with `names_repair`
    

    创建于2020年10月22日 reprex package

    1 回复  |  直到 5 年前
        1
  •  1
  •   Ronak Shah    5 年前

    pivot_wider 相当于 spread

    library(dplyr)
    library(tidyr)
    
    df %>% count(A,B)
    
    #  A B n
    #1 a A 3
    #2 a B 1
    #3 a C 1
    #4 b A 2
    #5 b B 4
    #6 b C 2
    #7 c A 2
    #8 c B 4
    #9 c C 1
    

    注意如何 A

    df %>% count(A,B) %>% spread(key=B, value=n)
    #  A B C
    #1 3 1 1
    #2 2 4 2
    #3 2 4 1
    

    枢轴加宽 不允许这样。它希望你明确指出你想做什么。既然你已经有了 A names_from 你指定 B 作为列名称 'A' 很有价值所以你会有另一个 A

    一个选择是重命名原始文件 其他列。

    df %>% 
      count(A,B) %>% 
      rename(A1 = A) %>%
      pivot_wider(names_from=B, values_from=n)
    
    #   A1     A     B     C
    #  <chr> <int> <int> <int>
    #1 a         3     1     1
    #2 b         2     4     2
    #3 c         2     4     1
    
    推荐文章