【问题标题】:Count unique values by column and group of rows按列和行组计算唯一值
【发布时间】:2017-05-11 20:13:02
【问题描述】:

我有这个例子:df.Journal.Conferences

venue author0 author1 author2 ... author19
A     John    Mary
B     Peter   Jacob   Isabella  
C     Lia
B     Jacob   Lara    John
C     Mary
B     Isabella

我想知道每个地点有多少独特的作者

结果:

A 2
B 5
C 2

编辑: 这是我的数据的链接:GoogleDrive Excel sheet

【问题讨论】:

    标签: r


    【解决方案1】:

    因为您的数据难以重现,我生成了一个“相似”数据集, 这应该是字

    set.seed(1984)
    df <- data.frame(id = sample(1:5,10, replace= T), 
                     v1 = sample(letters[1:5],10,replace= T),
                     v2 = sample(letters[1:5],10,replace= T),
                     v3 = sample(letters[1:5],10,replace= T),
                     v4 = sample(letters[1:5],10,replace= T), 
                     stringsAsFactors = F)
    
    
    z <- data.frame( id = unique(df$id), n = NA )
    
    for (i in z$id)  {
    
      z$n[z$id == i] <- length(unique(unlist(df[df$id == i,-1])))
    
    }
    
    z
    #   id n
    # 1  4 4
    # 2  3 4
    # 3  2 4
    # 4  5 4
    # 5  1 3
    

    【讨论】:

    • 没用。如果我有不止一排场地,它会为两排带来不同的值。
    • 对不起,我没有意识到场地并不明显,我编辑了答案。
    • 我发现一个错误,我再次编辑,检查最后一个版本。
    • 在你的例子中,它应该返回:id = n, 4= 4, 3= 4, 2= 4, 5= 4 1= 3
    • 我做的有点太快了,现在应该修好了。
    【解决方案2】:

    使用@zx8754 数据进行测试,这段代码给出了你想要的(假设你有 NA 用于数据框中的空单元格):

    sapply(split(df1[,-1], df1$venue), function(x) length(unique(x[!is.na(x)])))
    # A B C 
    # 2 5 2 
    

    【讨论】:

    • 它必须计算唯一值。结果必须是# A 2 # B 5 # C 2
    • 对不起,那么应该是:sapply(split(df1[,-1], df1$venue), function(x) length(unique(x[!is.na(x)])))。我会编辑它。
    【解决方案3】:

    使用 dplyr 和 tidyr,将数据从宽到长重新整形,然后按计数分组。

    library(dplyr)
    library(tidyr)
    
    gather(df1, key = author, value = name, -venue) %>% 
      select(venue, name) %>% 
      group_by(venue) %>% 
      summarise(n = n_distinct(name, na.rm = TRUE))
    # # A tibble: 3 × 2
    #   venue     n
    #   <chr> <int>
    # 1     A     2
    # 2     B     5
    # 3     C     2
    

    数据

    df1 <- read.table(text ="
    venue,author0,author1,author2
    A,John,Mary,NA
    B,Peter,Jacob,Isabella
    C,Lia,NA,NA
    B,Jacob,Lara,John
    C,Mary,NA,NA
    B,Isabella,NA,NA
    ", header = TRUE, sep = ",", stringsAsFactors = FALSE)
    

    编辑:将您的 Excel 工作表保存为 CSV,然后使用 read.csv 读入,然后上面的代码返回以下输出:

    df1 <- read.csv("Journal_Conferences_Authors.csv", na.strings = "#N/A")
    
    # output
    
    # # A tibble: 427 × 2
    #                                     venue     n
    #                                    <fctr> <int>
    # 1                                    AAAI     4
    # 2                                     ACC     4
    # 3                               ACIS-ICIS     5
    # 4  ACM SIGSOFT Software Engineering Notes     1
    # 5       ACM Southeast Regional Conference     5
    # 6                                ACM TIST     3
    # 7       ACM Trans. Comput.-Hum. Interact.     3
    # 8                                    ACML     2
    # 9                                    ADMA     2
    # 10             Advanced Visual Interfaces     3
    # # ... with 417 more rows
    

    【讨论】:

    • 对我不起作用。返回包含所有项目总和的 1X1 表
    • @ABueno 请提供reproducible example data
    • @ABueno 对您的数据进行了测试,解决方案运行良好,请参阅有关如何将文件读入 R 的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2011-05-07
    相关资源
    最近更新 更多