【问题标题】:How to transfer the columns together and then sort them out in R如何将列转移到一起,然后在 R 中对它们进行排序
【发布时间】:2020-10-22 03:28:59
【问题描述】:

我有 20 列,这里是提供数据的示例的一部分:

df <- read.table(text = "Id1    Id2 Id3 Id4 Id5 Id6 Id7 Id8
Ali.J   koli.M  Handy.M kori.Z  Simon.B James.K Moli.Z  kori.Z
Smith.kol   Hoddy.G Nancy.M kori.Z  Simon.B Khan.M  Moli.Z  Peter.K
Kato.Bada   Ahadi.M Nancy.M kori.Z  Simon.B Khan.M  Moli.Z  Peter.K
Moli.Z  Rosi.Bab    Handy.M Khan.M  Rose.M  Khan.M  Ali.J   Peter.K
Nadia.M Ali.J   Kato.Bada   Khan.M  Rose.M  Khan.M  Ali.J   Peter.K
Sarah.B Moli.z  Handy.M Khan.M  Rose.M  James.K Ali.J   Kato.Bada
 ", header = TRUE)

你可以看到我有 8 个 ID。我想移动 ID,如下所示。例如,Ali.j 出现在 id1、id2 和 id7 中。所以在第一列中,我们可以看到 id1、id2 和 id7。第二列是名称,最后一列是基于第一列的频率,所以它是三倍,最后,我想得到第二列和第三列的总和。这是预期的结果。

ID  Name    freq
id1,id2,id7 Ali.J   3
id1 Smith.Kol   1
id1,id3,id8 Kato.Bada   3
id1,id2,id7 Moli.Z  3
id1 Nadia.M 1
id1 Sarah.B 1
id2 Koli.M  1
id2 Hoddy.G 1
id2 Ahadi.M 1
id2 Rosi.Bab    1
id3 Handy.M 1
id3 Nancy.M 1
id4,id8 Kori.Z  1
id4,id6 Khan.M  1
id5 Simon.B 1
id5 Rose.M  1
id6 James.K 1
id8 Peter.k 1
sum 18  24

我们可以在 R 中做到吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以从base R使用aggregate

    aggregate(ind ~ ., unique(stack(df)), FUN = function(x) 
               c(N = length(x), Var = toString(x)))
    

    -输出

    #      values ind.N       ind.Var
    #1    Ahadi.M     1           Id2
    #2      Ali.J     3 Id1, Id2, Id7
    #3    Handy.M     1           Id3
    #4    Hoddy.G     1           Id2
    #5    James.K     1           Id6
    #6  Kato.Bada     3 Id1, Id3, Id8
    #7     Khan.M     2      Id4, Id6
    #8     koli.M     1           Id2
    #9     kori.Z     2      Id4, Id8
    #10    Moli.z     1           Id2
    #11    Moli.Z     2      Id1, Id7
    #12   Nadia.M     1           Id1
    #13   Nancy.M     1           Id3
    #14   Peter.K     1           Id8
    #15    Rose.M     1           Id5
    #16  Rosi.Bab     1           Id2
    #17   Sarah.B     1           Id1
    #18   Simon.B     1           Id5
    #19 Smith.kol     1           Id1
    

    【讨论】:

      【解决方案2】:

      试试这个tidyverse 方法:

      library(dplyr)
      library(tidyr)
      #Code
      newdf <- df %>% pivot_longer(everything()) %>%
        group_by(value) %>% summarise(N=n_distinct(name),
                                      Var=toString(unique(name)))
      

      输出:

      # A tibble: 19 x 3
         value         N Var          
         <fct>     <int> <chr>        
       1 Ali.J         3 Id1, Id7, Id2
       2 Kato.Bada     3 Id1, Id3, Id8
       3 Moli.Z        2 Id7, Id1     
       4 Nadia.M       1 Id1          
       5 Sarah.B       1 Id1          
       6 Smith.kol     1 Id1          
       7 Ahadi.M       1 Id2          
       8 Hoddy.G       1 Id2          
       9 koli.M        1 Id2          
      10 Moli.z        1 Id2          
      11 Rosi.Bab      1 Id2          
      12 Handy.M       1 Id3          
      13 Nancy.M       1 Id3          
      14 Khan.M        2 Id6, Id4     
      15 kori.Z        2 Id4, Id8     
      16 Rose.M        1 Id5          
      17 Simon.B       1 Id5          
      18 James.K       1 Id6          
      19 Peter.K       1 Id8   
      

      【讨论】:

      • 这个解决方案比我的要好,因为它满足了计算唯一值的需要。
      • 请看我的输出。我们能做得更好吗?
      【解决方案3】:

      仅使用循环(但最好从其他答案中学习如何使用包):

      newdf = data.frame(names = unique(as.vector(as.matrix(df))))
      for(i in 1:nrow(newdf)){
        index = which(apply(df,2,function(x){newdf$names[i] %in% x}))
        newdf$id[i] = paste(names(index), collapse=", ")
        newdf$frequency[i] = length(index)}
      

      【讨论】:

        【解决方案4】:

        这是一个tidyverse 解决方案。来自tidyrpivot_longer() 函数将您的表格变成一个长data.frame,每一行都有一个名称-ID 对。如果我们group_by(Name) 我们可以summarise() 分组数据。 n() 函数计算行数,toString() 将向量转换为以逗号分隔的单个字符串。

        library(dplyr)
        library(tidyr)
        
        df %>%
          pivot_longer(everything(), names_to = "ID", values_to = "Name") %>%
          group_by(Name) %>%
          summarise(freq = n(),
                    ID = toString(ID))
        `summarise()` ungrouping output (override with `.groups` argument)
        # A tibble: 19 x 3
           Name       freq ID                               
           <chr>     <int> <chr>                            
         1 Ahadi.M       1 Id2                              
         2 Ali.J         5 Id1, Id7, Id2, Id7, Id7          
         3 Handy.M       3 Id3, Id3, Id3                    
         4 Hoddy.G       1 Id2                              
         5 James.K       2 Id6, Id6                         
         6 Kato.Bada     3 Id1, Id3, Id8                    
         7 Khan.M        7 Id6, Id6, Id4, Id6, Id4, Id6, Id4
         8 koli.M        1 Id2                              
         9 kori.Z        4 Id4, Id8, Id4, Id4               
        10 Moli.z        1 Id2                              
        11 Moli.Z        4 Id7, Id7, Id7, Id1               
        12 Nadia.M       1 Id1                              
        13 Nancy.M       2 Id3, Id3                         
        14 Peter.K       4 Id8, Id8, Id8, Id8               
        15 Rose.M        3 Id5, Id5, Id5                    
        16 Rosi.Bab      1 Id2                              
        17 Sarah.B       1 Id1                              
        18 Simon.B       3 Id5, Id5, Id5                    
        19 Smith.kol     1 Id1  
        

        【讨论】:

        • 谢谢,但它并没有反映我的结果,而且还出错了加号错误:“summarise() ungrouping”中的意外符号
        猜你喜欢
        • 1970-01-01
        • 2015-11-11
        • 2020-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多