【问题标题】:Grouping by factor absent in dataset按数据集中不存在的因子分组
【发布时间】:2015-06-10 10:12:49
【问题描述】:

我正在使用 dplyr 为一系列文件计算变量 [mode] 的分组。目标是构建一个数据框,您可以在其中复制(cbind)每个文件的结果(欢迎任何关于更好数据结构的想法)。

所以文件是这样的:

FILE 1:
id |mode | no.cases
1    1      3
2    2      1
3    5      2

FILE 'n':
id |mode | no.cases
1    1      11
2    3      7
3    4      1

某些文件可能包含所有 5 个类别的条目,而其他文件仅包含其中 2 或 3 个类别的条目。我可以使用以下方法从完整文件中获取所有现有类别: categories<-factor(mode)

不过,使用 group_by 时还是会出现问题:

result <-group_by(file,mode,sum(no.cases))    
result (for file 1):
mode | no.cases
1      3
2      1
5      2

因为你不能在不同的号码上绑定。行数:在某些情况下,生成的数据框将有 5 行,在某些情况下只有 3 行。

如何使用 group_by 以便它为每个文件显示所有现有类别,以及不显示值 0 的类别?

例如

result (for file 1):
mode | no.cases
1      3
2      1
3      0
4      0
5      2

提前致谢,p.

【问题讨论】:

    标签: r group-by dplyr


    【解决方案1】:

    假设您已将完整文件中的所有类别放入名为categories.df的数据框中

    categories <- c(1,2,3,4,5)
    # create data frame
    categories.df <- data.frame(categories)
    # rename column name
    colnames(categories.df)[colnames(categories.df)=="categories"] <- "mode"
    
    > categories.df
      mode
        1
        2
        3
        4
        5
    

    以下是将 categories.df 与您的 file1 合并的示例代码

    R 代码:

    # Method 1: merge function
    df <- merge(x = categories.df, y = file1, by = "mode", all = TRUE)
    df$id <- NULL # remove id
    df[is.na(df)] <- 0 # replace na with zero
    
    # Method 2: using dplyr
    library(dplyr)
    df <- left_join(categories.df, file1)
    df$id <- NULL # remove id
    df[is.na(df)] <- 0 # replace na with zero
    
    # Method 2: using plyr
    library(plyr)
    df <- join(categories.df, file1, type="left")
    df$id <- NULL # remove id
    df[is.na(df)] <- 0 # replace na with zero
    

    输出:

    > df
      mode no.cases
        1        3
        2        1
        3        0
        4        0
        5        2
    

    希望这会有所帮助。

    【讨论】:

    • 可以,谢谢!一个小小的反对意见是你需要经历一个过程(恢复所有文件不存在的类别,将'NA'设置为0),但它工作正常。
    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多