【问题标题】:Count the number of rows where all columns have identical values计算所有列具有相同值的行数
【发布时间】:2017-08-29 21:45:03
【问题描述】:

我有一个数据框,我想计算每一行中所有列具有相同值的行数。

例如,我有这个数据:

cmp <- read.table(text = "
A B C D
1 1 1 0
1 1 1 1
2 2 2 2
3 3 3 0", header = TRUE)

这里计数为2,因为第二行和第三行各只有一个唯一值,分别只有1s和2s。

提前致谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    这个使用apply() 来计算每行中不同元素的数量,应该可以解决问题:

    sum(apply(cmp, 1, function(x) length(unique(x))==1))
    ## [1] 2
    

    【讨论】:

    • 或者使用更少的字符:sum(apply(cmp, 1, function(x) sd(x) == 0)) ;)
    • @Henrik 哈!当然(就像已经提供的其他几个解决方案一样)如果 data.frame 包含任何 NA 值,它就会失败。此外,与我的不同,它不会自动泛化到包含例如字符值的列。
    【解决方案2】:

    计算每行等于第一个值的值的数量。如果此计数等于列数,则该行中的所有值都相同。

    sum(rowSums(cmp == cmp[ , 1]) == ncol(cmp))
    #[1] 2
    

    【讨论】:

      【解决方案3】:

      您可以检查各行的最大值和最小值是否相同

      sum(do.call(pmax, cmp) == do.call(pmin, cmp))
      #[1] 2
      

      获取存在相同值的行

      which(do.call(pmax, cmp) == do.call(pmin, cmp))
      #[1] 2 3
      

      【讨论】:

        【解决方案4】:

        tidyverse 方式:

        df %>% 
          rowwise() %>% 
          mutate(unique_vals = length(unique(c_across(everything()))))
        

        这为您提供了所选列的唯一值的数量——您可以随意将everything() 更改为您需要的任何值。然后,您可以随意过滤/求和此变量。

        【讨论】:

          猜你喜欢
          • 2013-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-09
          • 1970-01-01
          • 2022-01-08
          相关资源
          最近更新 更多