首页 > 解决方案 > pivot_wider() 参数意味着不同的行数 Eroor

问题描述

我有以下 data.table 对象称为x

 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。如果有人知道我没有看到的可能问题,我将不胜感激。

作为旁注,所有列都是 type character,如果这是任何有用的信息

标签: rdata.tablepivottidyr

解决方案


如果我们想使用pivot_wider,我们可以在不创建新列的情况下通过指定values_fnasI

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%

但是,这些问题可以很容易地transposedata.table

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

或者使用deframewhichas_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))

推荐阅读