微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R:unnest 函数如何工作以及如何克服不兼容的长度错误? 我研究过的来源列表:

如何解决R:unnest 函数如何工作以及如何克服不兼容的长度错误? 我研究过的来源列表:

我从早上开始就在 SO 上彻底研究这个问题。原始数据集有 1000 多行。 我的全局目标是提取特定的列来运行 OLS 回归

我选择了我需要的列并使用 pivot_wider 将其转换为宽格式。在转换后的表中,我有 5 列代表指标名称。行是响应者的 ID,值是答案。

问题是在转换之后,值会变异为嵌套对象。我尝试使用 unnest(cols = everything()) 在示例数据集上解决此问题。它工作正常:

examp_df <- tibble(
  seance = rep(1:5,each = 5),ind = rep(inds,5),ind_name = rep(inds_name,answer = list(rep(rnorm(5,0.7,1),5))
)

examp_df_wide <- examp_df %>%
  pivot_wider(id_cols = seance,names_from = ind_name,values_from = answer) 


exmap_df_wide <- examp_df_wide %>%
  unnest(cols = everything())

但是当我在我的原始数据集上尝试它时,我收到一个关于长度不兼容的错误。然后我不明白 unnest 是如何工作的。

这是我遇到问题的 the dataset。如何取消嵌套数据?

我研究过的来源列表:

  1. Pivot wider produces nested object

  2. R: Error: Incompatible lengths when using unnest in dplyr

  3. Unnest or unchop dataframe containing lists of different lengths

  4. https://tidyr.tidyverse.org/articles/nest.html

原始数据为 here

原始数据的代码如下:

data_all <- data_all %>%
  pivot_wider(id_cols = seance_id,values_from = criteria_answ)
> data_all <- data_all %>%
+   unnest(cols = everything())
Error: Incompatible lengths: 4,5.
Run `rlang::last_error()` to see where the error occurred.

解决方法

如果你想要一个非嵌套的数据框,你可以这样做:

library(tidyr)

pivot_wider(data_all,names_from = ind_name,values_from = criteria_answ)

# A tibble: 3,930 x 7
#   seance_id criteria name2 name1 name3 name5 name4
#   <chr>     <chr>    <chr> <chr> <chr> <chr> <chr>
# 1 3133688   ind3_2   7     NA    NA    NA    NA   
# 2 3133688   ind4_2   6     NA    NA    NA    NA   
# 3 3133688   ind3_3   NA    7     NA    NA    NA   
# 4 3133688   ind3_4   NA    NA    7     NA    NA   
# 5 3133688   ind4_3   NA    6     NA    NA    NA   
# 6 3133688   ind4_4   NA    NA    6     NA    NA   
# 7 3133688   nps      NA    NA    NA    5     NA   
# 8 3145092   ind1_1   NA    NA    NA    NA    5    
# 9 3145092   ind1_2   4     NA    NA    NA    NA   
#10 3145092   ind1_3   NA    5     NA    NA    NA   
# … with 3,920 more rows

如果您想要每个 seance_id 都在 1 行中的输出,您需要考虑如何在 seance_id 的列中显示超过 1 个值的那些值?例如,如果您查看上面的输出,seance_id = 3133688name2 列中有两个值。要将 3133688 折叠为一行,您将如何组合这些值?您是要取它们的 summean 还是将它们组合为一个逗号分隔值。您可以在 values_fn 中使用 pivot_wider 参数并传递要应用的函数。例如,使用 toString :

pivot_wider(data_all,id_cols = seance_id,values_from = criteria_answ,values_fn = toString)

# A tibble: 422 x 6
#   seance_id name2         name1           name3         name5 name4        
#   <chr>     <chr>         <chr>           <chr>         <chr> <chr>        
# 1 3133688   7,6          7,6            7,6          5     NA           
# 2 3145092   4,5,8    5,9      5,6,7    3     5,8   
# 3 3143656   10            10              10            10    10           
# 4 3145088   9,9,9       10,8,8        9,10,7      8     9,10    
# 5 3145117   6,4,7       7,9         7,9       6     8,9      
# 6 3148589   10,7     10,5       8,5       9     10,7    
# 7 3135731   10,7      9,6         8,8       8     10,7     
# 8 3145111   7,7,9 10,9 9,9 4     9,9
# 9 3149981   8,8    8,9      8,8    9     9,9   
#10 3150048   9             10              10            10    9            
# … with 412 more rows

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。