【问题标题】:how to avoid "No common size" error for separate_rows()-function如何避免separate_rows()-function 的“No common size”错误
【发布时间】:2019-12-29 00:13:22
【问题描述】:

我正在处理看起来像这样的数据:

    AF:         AU:
1   MIT Duflo, Esther
2   NBER; NBER  Freeman, Richard B.; Gelber, Alexander M.
3   U MI; Cornell U; U VA   Bound, John; Lovenheim, Michael F.; Turner, Sarah
4   Harvard U; U Chicago    Fryer, Roland G., Jr.; Levitt, Steven D.
5   U OR; U CA, Davis; U British Columbia   Lindo, Jason M.; Sanders, Nicholas J.; Oreopoulos, Philip

我有两个变量,AF:代表隶属关系,AU:代表作者。不同的作者和隶属关系用分号分隔,我想使用separate_rows-command 并创建这样的东西:

   AF:               AU:
    MIT               Duflo, Esther
    NBER              Freeman, Richard B.
    NBER              Gelber, Alexander M.
    U MI              Bound, John 
    Cornell U         Lovenheim, Michael F. 
    U VA              Turner, Sarah
    Harvard U;        Fryer, Roland G., Jr.
    U Chicago         Levitt, Steven D.
    U OR              Lindo, Jason M.
    U CA,             Davis Sanders, Nicholas J. 
    U British ColumbiaOreopoulos, Philip 

separate_rows() 的标准版本会生成错误消息,可能是因为我的数据包含 NA:

authaf_spread<-separate_rows(authaf, 1:2, sep=";")
Error: All nested columns must have the same number of elements.

我下载并安装了开发版,这只是给了我另一个错误消息:

authaf_spread<-separate_rows(authaf, 1:2, sep=";")
Error: No common size for `AF:`, size 3, and `AU:`, size 4.
Call `rlang::last_error()` to see a backtrace

这是什么意思,我该如何规避这个错误?

如果有人感兴趣,我附上整个文件的链接:

https://www.dropbox.com/s/z456w7ll7v7o79z/authors_affiliations.csv?dl=0

【问题讨论】:

    标签: r tidyr data-cleaning


    【解决方案1】:

    如果您拨打separate_rows 两次,它将起作用。我使用 stringr 中的 str_trim 删除出现在作者姓名和附属机构之前和之后的空格,并使用 tidyr 中的 drop_na 删除两列都有 NA 的行。

    # Loaded your .csv file as variable 'df'
    
    authors <- df %>%
      separate_rows(AF., sep = ";") %>%
      separate_rows(AU., sep = ";") %>%
      mutate_all(~ str_trim(., side = "both")) %>%
      drop_na
    
    # A tibble: 24,877 x 2
       AF.       AU.                  
       <chr>     <chr>                
     1 MIT       Duflo, Esther        
     2 NBER      Freeman, Richard B.  
     3 NBER      Gelber, Alexander M. 
     4 NBER      Freeman, Richard B.  
     5 NBER      Gelber, Alexander M. 
     6 U MI      Bound, John          
     7 U MI      Lovenheim, Michael F.
     8 U MI      Turner, Sarah        
     9 Cornell U Bound, John          
    10 Cornell U Lovenheim, Michael F.
    # … with 24,867 more rows
    

    您还可以使用distinct 删除与作者和从属关系重复的行。

    authors %>% distinct(AF., AU.)
    
    # A tibble: 5,873 x 2
       AF.       AU.                  
       <chr>     <chr>                
     1 MIT       Duflo, Esther        
     2 NBER      Freeman, Richard B.  
     3 NBER      Gelber, Alexander M. 
     4 U MI      Bound, John          
     5 U MI      Lovenheim, Michael F.
     6 U MI      Turner, Sarah        
     7 Cornell U Bound, John          
     8 Cornell U Lovenheim, Michael F.
     9 Cornell U Turner, Sarah        
    10 U VA      Bound, John          
    # … with 5,863 more rows
    

    【讨论】:

    • 我认为 OP 只想要df %&gt;% separate_rows(AF.,AU., sep = ";")。就这样。我明白了你的答案。这就是为什么我不会回答。
    • 我之前尝试过,但出现错误。仅当我像这篇文章中那样将两个 separate_rows 调用分开时才有效。我很想知道是否有人只需一个电话就能让它工作。
    • 我刚刚意识到,数据集可能有问题。实际上我在我的电脑上运行代码:df %&gt;% separate_rows(AF.,AU., sep = ";")head(df)。它奏效了!但是我将它应用于整个df。然后我也报错了!你说的对。数据集中一定有问题。
    • 我查了一下,一个变量的值比另一个多 14 个,我现在不记得是哪个了。
    • @maydin 很高兴您使用整个 df.可能只是与不匹配的值数字固有的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2018-10-29
    • 2018-07-04
    相关资源
    最近更新 更多