【问题标题】:R duplicate a whole role if one column meets a certain criterion [duplicate]如果一列满足某个标准,则R复制整个角色[重复]
【发布时间】:2021-08-28 03:43:59
【问题描述】:

我不知道如何解决这个问题。我的数据框看起来像这样(但要大得多):

df <- data.frame(word = c('word1','word2', 'word3', 'word4', 'word5', 'word6', 'word7'), code = c(1 , 2, 2, 2, 1, 1, 2), modality = c('cog', 'emo', 'soc', 'cog_emo', 'soc', 'soc_emo_cog', 'emo'))
df
   word code    modality
1 word1    1         cog
2 word2    2         emo
3 word3    2         soc
4 word4    2     cog_emo
5 word5    1         soc
6 word6    1 soc_emo_cog
7 word7    2         emo

模态列显示单词被分配到的模态。但我需要计算分配给一种模式的单词数。如果一个词被分配给多个模态,则必须为每个模态计算它。因此,我想复制分配了多个模态的整行,以便每行有一个模态。有点像这样:

    word code modality
1  word1    1      cog
2  word2    2      emo
3  word3    2      soc
4  word4    2      cog
5  word4    2      emo
6  word5    1      soc
7  word6    1      soc
8  word6    1      emo
9  word6    1      cog
10 word7    2      emo

正如我所说,数据框要大得多,所以我不能手动完成。 谢谢!!

【问题讨论】:

    标签: r


    【解决方案1】:
    library(tidyverse)
    
    df %>% mutate(modality = str_split(modality, "_")) %>% unnest(modality)
    
       word   code modality
       <fct> <dbl> <chr>   
     1 word1     1 cog     
     2 word2     2 emo     
     3 word3     2 soc     
     4 word4     2 cog     
     5 word4     2 emo     
     6 word5     1 soc     
     7 word6     1 soc     
     8 word6     1 emo     
     9 word6     1 cog     
    10 word7     2 emo  
    

    【讨论】:

      【解决方案2】:

      tidyr::separate_rows() 正好适用于这种情况

      
      library(tidyr)
      
      df %>% separate_rows(modality, sep = '_')
      
      #> # A tibble: 10 x 3
      #>    word   code modality
      #>    <chr> <dbl> <chr>   
      #>  1 word1     1 cog     
      #>  2 word2     2 emo     
      #>  3 word3     2 soc     
      #>  4 word4     2 cog     
      #>  5 word4     2 emo     
      #>  6 word5     1 soc     
      #>  7 word6     1 soc     
      #>  8 word6     1 emo     
      #>  9 word6     1 cog     
      #> 10 word7     2 emo
      

      reprex package (v2.0.0) 于 2021-06-11 创建

      【讨论】:

      • 强大的separate_rows!
      【解决方案3】:

      这是一个data.table 选项

      > setDT(df)[,.(modality = unlist(strsplit(modality,"_"))),.(word,code)]
           word code modality
       1: word1    1      cog
       2: word2    2      emo
       3: word3    2      soc
       4: word4    2      cog
       5: word4    2      emo
       6: word5    1      soc
       7: word6    1      soc
       8: word6    1      emo
       9: word6    1      cog
      10: word7    2      emo
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        • 2021-03-09
        相关资源
        最近更新 更多