代码之家  ›  专栏  ›  技术社区  ›  Jens

如何获得具有特定数据的行数?

r
  •  3
  • Jens  · 技术社区  · 6 年前

    我有数据框

              COL1         COL2 
    1          X            X
    2          X            X
    3          X            Y
    4          X            X
    5          Z            X
    

    5 回复  |  直到 6 年前
        1
  •  2
  •   DanY    6 年前

    which 可以在任意数量的列上工作:

    # example data
    df <- data.frame(
        col1 = c("X", "X", "X", "X", "Z"),
        col2 = c("X", "X", "Z", "X", "X"),
        stringsAsFactors = FALSE
    )
    
    # how to get rows without X
    unique(sapply(df, function(x) which(x != "X")))
    
        2
  •  1
  •   Rahul Agarwal    6 年前

    这将起作用:

    library(dplyr)
    filter(df, (COL1!="X" & COL2!="X"))
    
        3
  •  1
  •   Ben G    6 年前

    这里有一个 tidyverse 可以处理任意数量列的解决方案

    library(tidyverse)
    
    df <- tibble(
     col1 = c("X", "X", "X", "X", "Z"),
     col2 = c("X", "X", "Z", "X", "X"),
     col3 = c("X", "X", "Z", "Z", "X"),
    )
    
    filter_all(df, any_vars(. != "X"))
    

    返回:

    # A tibble: 3 x 3
     col1  col2  col3
      <chr> <chr> <chr>
      1     X     Z     Z
      2     X     X     Z
      3     Z     X     X
    
        4
  •  1
  •   Shree    6 年前

    下面是一个baser解决方案,它可以用于任意数量的列-

    which(rowSums(df == "X") != ncol(df))

        5
  •  1
  •   Rui Barradas    6 年前

    你很接近,你想用 sapply 带基元函数 !=

    sapply(dat, `!=`, "X")
    #      COL1  COL2
    #[1,] FALSE FALSE
    #[2,] FALSE FALSE
    #[3,] FALSE  TRUE
    #[4,] FALSE FALSE
    #[5,]  TRUE FALSE
    

    如果你需要行号,把它包起来 which ,带参数 arr.ind 设置为 TRUE .

    which(sapply(dat, `!=`, "X"), arr.ind = TRUE)
    #     row col
    #[1,]   5   1
    #[2,]   3   2
    

    编辑。

    发布了几种解决方案,下面是比较测试。

    功能 RuiJaap Rui Jaap评论中的建议。

    Rui <- function(DF, value = "X")
      which(sapply(DF, `!=`, value), arr.ind = TRUE)
    
    DanY <- function(DF, value = "X")
      unique(sapply(DF, function(x) which(x != value)))
    
    Jaap <- function(DF, value = "X")
      which(!!rowSums(DF != value))
    
    RuiJaap <- function(DF, value = "X")
      which(dat != "X", arr.ind = TRUE)
    
    library(ggplot2)
    library(microbenchmark)
    
    mb1 <- microbenchmark(Rui = Rui(dat),
                          RuiJaap = RuiJaap(dat),
                          Jaap = Jaap(dat),
                          DanY = DanY(dat),
                          times = 1e3)
    
    mb2 <- microbenchmark(Rui = Rui(dat2),
                          RuiJaap = RuiJaap(dat2),
                          Jaap = Jaap(dat2),
                          DanY = DanY(dat2),
                          times = 1e2)
    
    autoplot(mb1)
    autoplot(mb2)
    

    对于小型数据集 DanY 鲁雅普 是最快的。

    数据。

    dat <- read.table(text = "
              COL1         COL2 
    1          X            X
    2          X            X
    3          X            Y
    4          X            X
    5          Z            X                  
    ", header = TRUE)
    
    
    set.seed(1)
    dat2 <- matrix("X", nrow = 20, ncol = 100)
    dat2[sample(2000, 100)] <- "Y"
    dat2 <- as.data.frame(dat2)