【问题标题】:How do I get unique id count across columns in R?如何获得 R 中各列的唯一 ID 计数?
【发布时间】:2015-05-10 04:19:37
【问题描述】:

我有类似这样的法律数据。我正在使用 RStudio。

> head(gsu[,107:117])
    HtoODay PAOSLDME DUSHD POELRD XCAB WESDF BILOE HYPERDIF IMPSENS      Billing MALLAMP
42        0     <NA>    No     No  <NA>  <NA>  <NA>       No    <NA>  Hourly      NA
61        0     <NA>    Yes    Yes <NA>   Yes  <NA>      Yes    <NA>  Hourly      NA
230       0     <NA>    No     Yes <NA>  <NA>  <NA>      Yes    <NA>  Hourly      NA
235       0     <NA>    No     No  <NA>  <NA>  <NA>      Yes    <NA>  Hourly      NA
302       0     <NA>    No     No  <NA>  <NA>   No        No    <NA>  Hourly      NA
336       3     <NA>    No     No   Yes  <NA>  <NA>       No    <NA> Consult      NA
> 

我想获得唯一 Yes 出现的行数。我的意思是,如果 Yes 出现在一个列中,则无论另一列的 Yes 或 No 值如何,这都会记录为 1。

例如, 第 61 行将计为 1 个“是”计数,即使该行包含跨列的多个“是”,而第 336 行也将在总计数中注册为 1,仅给定一个“是”实例。

基本上,我如何计算列中二进制实例的唯一行,而不考虑多个行内实例?

【问题讨论】:

  • 这里有mysqlsqldf 标签的具体原因吗?

标签: r


【解决方案1】:
rowSums(df=="Yes", na.rm=TRUE)>=1

给予

#   42    61   230   235   302   336 
#FALSE  TRUE  TRUE  TRUE FALSE  TRUE 

【讨论】:

    【解决方案2】:

    另一种选择是

    (1:nrow(gsu) %in% which(gsu=='Yes', arr.ind=TRUE)[,1])+0L
    #[1] 0 1 1 1 0 1
    

    或者

     apply(gsu=='Yes' & !is.na(gsu), 1, any) + 0L
     #   42  61 230 235 302 336 
     #   0   1   1   1   0   1 
    

    或者

     Reduce(`|`,as.data.frame(gsu=='Yes' & !is.na(gsu))) + 0L
     #[1] 0 1 1 1 0 1
    

    或者

      do.call(`pmax`, c(lapply(gsu,`==`, 'Yes'), na.rm=TRUE))
      #[1] 0 1 1 1 0 1
    

    基准测试

    set.seed(24)
    gsu1 <- as.data.frame(matrix(sample(c(NA, 'Yes', 'No', LETTERS), 
        4000*4000, replace=TRUE), ncol=4000), stringsAsFactors=FALSE) 
    
    akrun1 <- function() (1:nrow(gsu1) %in% which(gsu1=='Yes', 
               arr.ind=TRUE)[,1]) +0L
    akrun2 <- function() do.call(`pmax`, c(lapply(gsu1, `==`, 'Yes'), 
               na.rm=TRUE))
    ExperimenteR <- function() rowSums(gsu1=="Yes", na.rm=TRUE)>=1
    
    library(microbenchmark)
    microbenchmark(akrun1(), akrun2(), ExperimenteR(), unit='relative', times=20L)
     #Unit: relative
     #        expr      min       lq     mean   median       uq      max neval cld
     #     akrun1() 1.244682 1.293628 1.293696 1.294336 1.319209 1.277138    20   b
     #     akrun2() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000    20  a 
     # ExperimenteR() 1.213802 1.296464 1.276666 1.295421 1.280282 1.209436    20   b
    

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      相关资源
      最近更新 更多