【问题标题】:pivot_wider() arguments imply differing number of rows Eroorpivot_wider() 参数暗示不同的行数错误
【发布时间】:2021-01-01 15:46:19
【问题描述】:

我有以下名为 x 的 data.table 对象:

 month.option   som.month
  all.year        56.6%
     diff        -0.9%

当我执行以下操作时:

x %>% pivot_wider(names_from = month.option, values_from = som.month) %>%
                select(diff, everything()) %>%
                set_names(c("Dif vs MA", "SOM YTD", "SOM AA"))

我收到以下错误:Error in data.frame(row = row_id, col = col_id) : arguments imply differing number of rows: 0, 2。但是我不明白原因,因为x 是一个 2x2 data.table。如果有人知道我没有看到的可能问题,我将不胜感激。

附带说明,所有列的类型均为character,如果有任何有用信息的话

【问题讨论】:

    标签: r data.table pivot tidyr


    【解决方案1】:

    如果我们想使用pivot_wider,我们可以通过将values_fn 指定为I 来执行此操作而无需创建新列

    library(dplyr)
    library(tidyr)
    x %>% 
      pivot_wider(names_from = month.option, values_from = som.month, values_fn =  I)
    # A tibble: 1 x 2
    #  all.year diff    
    #  <I<chr>> <I<chr>>
    #1 56.6%    -0.9%  
    

    或者也可以是获取first元素的函数

    x %>% 
       pivot_wider(names_from = month.option, 
              values_from = som.month, values_fn =  first)
    # A tibble: 1 x 2
    #   all.year diff 
    #  <chr>    <chr>
    #1 56.6%    -0.9%
    

    不过,这类问题可以通过transpose from data.table 轻松解决

    data.table::transpose(x, make.names = 'month.option')
    #  all.year  diff
    #1    56.6% -0.9%
    

    或者使用deframeas_tibble_row 会更直接

    library(tibble)
    deframe(x) %>%
       as_tibble_row
    # A tibble: 1 x 2
    #  all.year diff 
    #  <chr>    <chr>
    #1 56.6%    -0.9%
    

    或者另一种选择是将第一列转换为行名,使用t 进行转置并转换为tibble(或data.frame

    x %>% 
        column_to_rownames('month.option') %>% 
         t %>%
         as_tibble
    # A tibble: 1 x 2    
    #   all.year diff 
    #  <chr>    <chr>
    #1 56.6%    -0.9%
    

    数据

    x <- structure(list(month.option = c("all.year", "diff"), som.month = c("56.6%", 
    "-0.9%")), class = "data.frame", row.names = c(NA, -2L))
    

    【讨论】:

      【解决方案2】:

      用相同的pivot_wider() 试试这个tidyverse 解决方案。您遇到问题是因为该函数无法正确识别行。创建一个id是解决方案:

      #Code
      df %>% mutate(id=1) %>%
       pivot_wider(names_from = month.option,values_from=som.month) %>%
      select(-1)
      

      输出:

      # A tibble: 1 x 2
        all.year diff 
        <chr>    <chr>
      1 56.6%    -0.9%
      

      使用的一些数据:

      #Data
      df <- structure(list(month.option = c("all.year", "diff"), som.month = c("56.6%", 
      "-0.9%")), class = "data.frame", row.names = c(NA, -2L))
      

      【讨论】:

        【解决方案3】:

        如果您有data.table,我们也可以使用dcast

        library(data.table)
        dcast(x, rowid(month.option)~month.option, value.var = 'som.month')
        
        #   month.option all.year  diff
        #1:            1    56.6% -0.9%
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-24
          • 2015-02-04
          • 1970-01-01
          • 2014-07-17
          • 1970-01-01
          相关资源
          最近更新 更多