R 检查与特定值匹配的所有列中的行

R 检查与特定值匹配的所有列中的行,r,data.table,R,Data.table,如果我有一个数据表: d <- data.table("ID" = c(1, 2, 2, 4, 6, 6), "TYPE" = c(1, 1, 2, 2, 3, 3), "CLASS" = c(1, 2, 3, 4, 5, 6)) 导致矩阵类型无效 注意 有人提出这个问题类似于。 但是,他们使用的是data.frame,而我使用的是data.table符号不同。因此不是重复的问题。使用apply和any d[!apply

如果我有一个
数据表

d <- data.table("ID" = c(1, 2, 2, 4, 6, 6), 
                "TYPE" = c(1, 1, 2, 2, 3, 3), 
                "CLASS" = c(1, 2, 3, 4, 5, 6))
导致
矩阵类型无效

注意

有人提出这个问题类似于。
但是,他们使用的是
data.frame
,而我使用的是
data.table
符号不同。因此不是重复的问题。

使用
apply
any

d[!apply(d>2,1,any)]
   ID TYPE CLASS
1:  1    1     1
2:  2    1     2
rowSums

d[rowSums(d>2)==0,]
   ID TYPE CLASS
1:  1    1     1
2:  2    1     2

使用
apply
any

d[!apply(d>2,1,any)]
   ID TYPE CLASS
1:  1    1     1
2:  2    1     2
rowSums

d[rowSums(d>2)==0,]
   ID TYPE CLASS
1:  1    1     1
2:  2    1     2

我想知道对于不同数量的行和列,最快的方法是什么

因此,这里有一个基准

IMHO说,它排除了检查
ID
列,因为该列与OP的问题不完全一致,但却是一个明智的决定

library(data.table)
library(bench)
bm <- press(
  n_row = c(1E1, 1E3, 1E5),
  n_col = c(2, 10, 50),
  {  
    set.seed(1L)
    d <- data.table(
      ID = seq_len(n_row),
      matrix(sample(10, n_row*n_col, TRUE), ncol = n_col)
    )
    mark(
      m1 = d[d[, !apply(.SD > 2, 1, any), .SDcols = -"ID"]],
      m2 = d[!d[, apply(.SD > 2, 1, any), .SDcols = -"ID"]],
      m3 = d[!d[, which(apply(.SD > 2, 1, any)), .SDcols = -"ID"]],
      m4 = d[d[, rowSums(.SD > 2) == 0, .SDcols = -"ID"]],
      m5 = d[!d[, Reduce(any, lapply(.SD, `>`, y = 2)), by = 1:nrow(d), .SDcols = -"ID"]$V1]
    )
  })

ggplot2::autoplot(bm)
库(data.table)
图书馆(长凳)
bm 2,1,any),.SDcols=-“ID”]],
m3=d[!d[,其中(应用(.SD>2,1,任意)),.SDcols=-“ID”],
m4=d[d[,行和(.SD>2)==0,.SDcols=-“ID”],
m5=d[!d[,Reduce(any,lappy(.SD,`>`,y=2)),by=1:nrow(d),.SDcols=-“ID”]$V1]
)
})
ggplot2::自动绘图(bm)


显然,
rowSums()
方法几乎总是最快的方法。

我想知道对于不同数量的行和列,最快的方法是什么

因此,这里有一个基准

IMHO说,它排除了检查
ID
列,因为该列与OP的问题不完全一致,但却是一个明智的决定

library(data.table)
library(bench)
bm <- press(
  n_row = c(1E1, 1E3, 1E5),
  n_col = c(2, 10, 50),
  {  
    set.seed(1L)
    d <- data.table(
      ID = seq_len(n_row),
      matrix(sample(10, n_row*n_col, TRUE), ncol = n_col)
    )
    mark(
      m1 = d[d[, !apply(.SD > 2, 1, any), .SDcols = -"ID"]],
      m2 = d[!d[, apply(.SD > 2, 1, any), .SDcols = -"ID"]],
      m3 = d[!d[, which(apply(.SD > 2, 1, any)), .SDcols = -"ID"]],
      m4 = d[d[, rowSums(.SD > 2) == 0, .SDcols = -"ID"]],
      m5 = d[!d[, Reduce(any, lapply(.SD, `>`, y = 2)), by = 1:nrow(d), .SDcols = -"ID"]$V1]
    )
  })

ggplot2::autoplot(bm)
库(data.table)
图书馆(长凳)
bm 2,1,any),.SDcols=-“ID”]],
m3=d[!d[,其中(应用(.SD>2,1,任意)),.SDcols=-“ID”],
m4=d[d[,行和(.SD>2)==0,.SDcols=-“ID”],
m5=d[!d[,Reduce(any,lappy(.SD,`>`,y=2)),by=1:nrow(d),.SDcols=-“ID”]$V1]
)
})
ggplot2::自动绘图(bm)


显然,
rowSums()
方法几乎总是最快的方法。

如果我们想忽略
ID
列怎么办@Wen@KAS
d[行和((d>2)[,!(colnames(d)=“ID”)]==0,]
d[!apply((d>2)[,!(colnames(d)=“ID”)],1,any)]
d[行和(d[,-'ID']>2)==0]
如果我们想忽略
ID
列怎么办@Wen@KAS
d[行和((d>2)[,!(colnames(d)=“ID”)]==0,]
d[!apply((d>2)[,!(colnames(d)=“ID”)],1,any)]
d[行和(d[,-'ID']>2)==0]
可能重复@Ryan。因此不是重复的问题。您想在检查中包括
ID
列还是应该豁免?可能重复@Ryan他们正在处理
数据。frame
和我正在处理
数据。table
符号不同。这不是一个重复的问题。您想在检查中包括
ID
列还是应该豁免?