【问题标题】:frequency table including names of observations包括观测名称的频率表
【发布时间】:2014-09-02 21:42:59
【问题描述】:

我想知道是否可以以更有效和“优雅”的方式完成以下操作:

我有类似于下面的数据,其中包含国家名称(位置)和一个国家加入的协议数量(no.agreements):

d <- structure(list(location = c("Afghanistan", "Angola", "Bangladesh", 
                                     "Bosnia-Herzegovina", "Burundi", "C\x99te d'Ivoire", "Cambodia", 
                                     "Chad", "Colombia", "Comoros", "Congo", "Croatia", "Democratic Republic of Congo (Zaire)", 
                                     "Djibouti", "El Salvador", "Georgia", "Guatemala", "Guinea Bissau", 
                                     "Haiti", "India", "Indonesia", "Liberia", "Macedonia", "Mali", 
                                     "Mexico", "Moldova", "Mozambique", "Nepal", "Niger", "Papua-New Guinea", 
                                     "Philippines", "Rwanda", "Senegal", "Serbia (Yugoslavia)", "Sierra Leone", 
                                     "Somalia", "South Africa", "Sudan", "Tajikistan", "Uganda", "United Kingdom"
    ), no.agreements = c(3L, 5L, 1L, 2L, 3L, 4L, 1L, 10L, 1L, 1L, 
                         1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 1L, 1L, 1L, 1L, 
                         1L, 1L, 2L, 3L, 3L, 1L, 1L, 2L, 3L, 2L, 1L, 3L, 1L, 1L, 1L)), .Names = c("location", 
                                                                                                  "no.agreements"), row.names = c(1L, 4L, 9L, 10L, 12L, 15L, 19L, 
                                                                                                                                  20L, 30L, 31L, 32L, 33L, 34L, 36L, 38L, 39L, 40L, 41L, 42L, 43L, 
                                                                                                                                  45L, 47L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 58L, 61L, 64L, 65L, 
                                                                                                                                  66L, 68L, 71L, 73L, 74L, 77L, 78L, 79L), class = "data.frame")

我对有多少国家(可变“位置”)有 1、2、3 等协议的频率感兴趣。 ftable(d$no.agreements) 产生请求的结果:23 个国家有 1 个协议,2 个国家有 8 个协议...

  1  2  3  4  5 10

 23  8  7  1  1  1

我现在想知道是否有直接的方法添加另一行 (!),其中包括每个类别中包含的国家/地区的名称,例如有 10 个协议的 1 个国家是乍得,有 5 个协议的 1 个国家是安哥拉等。附加行中的相应单元格将包括所有相关的国家名称(作为字符串)。

当然,我可以通过例如d[d$no.agreements==10,c("location")],然后对所有频率重复此操作并手动创建一个表,例如在 Excle 中。但是我想知道是否没有更直接的方法可以将位置名称作为列表(?)插入到附加行的单元格中。

这会让事情变得更加高效。非常感谢。

【问题讨论】:

    标签: r frequency


    【解决方案1】:

    您可以使用aggregate() 汇总表格。

    aggregate(location~no.agreements,data=d,FUN="unique")
    

    【讨论】:

    • 非常感谢。您建议的命令将国家/地区的名称作为列表提供给我。这就是我一直在努力解决的问题。但是,协议的数量丢失了。最终,我想出了 AgreementPerCountry
    【解决方案2】:

    这些并不是真正的行,而是列名向量和单个计数向量。如果您想要每个命名列的名称列表,您可以使用tapply

    > tapply(d$location, d$no.agreements, c)
    $`1`
     [1] "Bangladesh"     "Cambodia"       "Colombia"      
     [4] "Comoros"        "Congo"          "Croatia"       
     [7] "El Salvador"    "Georgia"        "Guatemala"     
    [10] "Guinea Bissau"  "Haiti"          "Macedonia"     
    [13] "Mali"           "Mexico"         "Moldova"       
    [16] "Mozambique"     "Nepal"          "Rwanda"        
    [19] "Senegal"        "South Africa"   "Tajikistan"    
    [22] "Uganda"         "United Kingdom"
    
    $`2`
    [1] "Bosnia-Herzegovina"                  
    [2] "Democratic Republic of Congo (Zaire)"
    [3] "Djibouti"                            
    [4] "India"                               
    [5] "Indonesia"                           
    [6] "Niger"                               
    [7] "Serbia (Yugoslavia)"                 
    [8] "Somalia"                             
    
    $`3`
    [1] "Afghanistan"      "Burundi"          "Liberia"         
    [4] "Papua-New Guinea" "Philippines"      "Sierra Leone"    
    [7] "Sudan"           
    
    $`4`
    [1] "C\x99te d'Ivoire"
    
    $`5`
    [1] "Angola"
    
    $`10`
    [1] "Chad"
    

    有几种方法可以捆绑交付:

     as.data.frame( tapply(d$location, d$no.agreements, function(x) list(x, length(x)))    )
                                                                                                                                                                              tapply(d$location, d$no.agreements, function(x) list(x, length(x)))
    1  Bangladesh, Cambodia, Colombia, Comoros, Congo, Croatia, El Salvador, Georgia, Guatemala, Guinea Bissau, Haiti, Macedonia, Mali, Mexico, Moldova, Mozambique, Nepal, Rwanda, Senegal, South Africa, Tajikistan, Uganda, United Kingdom, 23
    2                                                                                                                Bosnia-Herzegovina, Democratic Republic of Congo (Zaire), Djibouti, India, Indonesia, Niger, Serbia (Yugoslavia), Somalia, 8
    3                                                                                                                                                        Afghanistan, Burundi, Liberia, Papua-New Guinea, Philippines, Sierra Leone, Sudan, 7
    4                                                                                                                                                                                                                         C\x99te d'Ivoire, 1
    5                                                                                                                                                                                                                                   Angola, 1
    10                                                                                                                                                                                                                                    Chad, 1
    > do.call(rbind, tapply(d$location, d$no.agreements, function(x) list(x, length(x))))
       [,1]               [,2]
    1  Character,23       23  
    2  Character,8        8   
    3  Character,7        7   
    4  "C\x99te d'Ivoire" 1   
    5  "Angola"           1   
    10 "Chad"             1   
    

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多