【问题标题】:Counting unique values across variables (columns) in R在 R 中计算变量(列)中的唯一值
【发布时间】:2014-11-19 11:56:21
【问题描述】:

我有一个大型数据集,在 5 个时间段内重复测量。

   2012  2009  2006  2003  2000
    3     1     4     4     1
    5     3     2     2     3
    6     7     3     5     6 

我想添加一个新列,它是 2000 年到 2012 年之间唯一值的数量。例如,

   2012  2009  2006  2003  2000  nunique
    3     1     4     4     1      3
    5     3     2     2     3      3
    6     7     3     5     6      4

我在 R 中工作,如果有帮助,每个时间段的测量值只有 14 个可能的不同值。

我找到了这个页面:Count occurrences of value in a set of variables in R (per row) 并尝试了上面提供的各种解决方案。然而,它给我的是每个值的计数,而不是唯一值的数量。 这里的其他类似问题似乎询问关于计算变量/列中唯一值的数量,而不是每行。 任何建议,将不胜感激。

【问题讨论】:

    标签: r unique-values


    【解决方案1】:

    这是另一种选择

    > df$nunique <- apply(df, 1, function(x) length(unique(x)))
    > df
      2012 2009 2006 2003 2000 nunique
    1    3    1    4    4    1       3
    2    5    3    2    2    3       3
    3    6    7    3    5    6       4
    

    【讨论】:

    • 请注意:如果您的数据框中有 NA,这会将它们计为唯一值。修改为:df$nunique
    【解决方案2】:

    如果您有一个大型数据集,您可能希望避免循环遍历行,而是使用更快的框架,例如 S4Vectors:

    df <- data.frame('2012'=c(3,5,6),
                 '2009'=c(1,3,7),
                 '2006'=c(4,2,3),
                 '2003'=c(4,2,5),
                 '2000'=c(1,3,6))
    
    dup <- S4Vectors:::duplicatedIntegerPairs(as.integer(as.matrix(df)), row(df))
    dim(dup) <- dim(df)
    rowSums(!dup)
    

    或者,matrixStats 包:

    m <- as.matrix(df)
    mode(m) <- "integer"
    rowSums(matrixStats::rowTabulates(m) > 0)
    

    【讨论】:

    • 用 matrixStats 包试过 - 它确实更快 - 谢谢!
    • S4Vectors 比它快 4 倍左右。
    【解决方案3】:

    诀窍是使用“应用”并将每一行分配给一个变量(例如 x)。然后您可以编写一个自定义函数,在本例中使用“唯一”和“长度”来获得您想要的答案。

    df <- data.frame('2012'=c(3,5,6), '2009'=c(1,3,7), '2006'=c(4,2,3), '2003'=c(4,2,5), '2000'=c(1,3,6))
    
    df$nunique = apply(df, 1, function(x) {length(unique(x))})
    

    【讨论】:

      【解决方案4】:

      试试这个:

      sapply(data, function(x) length(unique(x)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        • 1970-01-01
        • 2021-09-10
        • 2020-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多