R语言 如何根据行中包含的范围/值选择列?

mzaanser  于 2023-03-15  发布在  其他
关注(0)|答案(2)|浏览(203)

我尝试选择行中的值满足特定条件(例如,在指定范围内)的列(变量)。
我的数据:

structure(list(X1 = c(35L, 45L, 67L, 890L, 23L, 4L, 5L, 34L, 
78L, 12L, 3L), X2 = c(100L, 2345L, 3467L, 235L, 46L, 76L, 32L, 
 17L, 346L, 789L, 32L), X3 = c(345L, 67L, 45L, 342L, 67L, 31L, 
6L, 78L, 9L, 34L, 23L), X4 = c(23L, 45L, 657L, 231L, 456L, 342L, 
56L, 44567L, 3211L, 2342L, 2L)), row.names = c(NA, -11L), class = c("data.table", 
 "data.frame"))

作为一个简单的例子,只找到一个值:

out <- dt[, lapply(.SD, function(x) which(x == 5))]

上面生成了一个所有列都存在且具有NA值的表

X1     X2    X3   X4
        7      NA    4    NA

通过这样做,我可以去掉这些NA值,从而得到我想要的列数。

out2 <- out %>% select_if(~ !any(is.na(.)))

      X1    X3
      7     4

问题:
1.有什么方法可以用data.table和一行代码来完成这个任务吗?
1.如何指定值的范围,例如(〉5 &〈1000)
1.在行中转置变量并使用类似dplyr filter_all这样的东西会不会更好?
任何帮助或正确方向的指示都将不胜感激。

a14dhokn

a14dhokn1#

不确定数据.表,但关于您的第二个问题:

library(tidyverse)

df %>%
  select(where(~all(. > 5 & . < 1000)))

这与select_if非常相似,它也回答了第三个问题:不,不需要改变形状/旋转。

irlmq6kh

irlmq6kh2#

使用sapplywith=FALSE选择列
具体数值:

dt[, sapply(dt, function(x) any(x == 342)), with=FALSE]
     X3    X4
 1: 345    23
 2:  67    45
 3:  45   657
 4: 342   231
 5:  67   456
 6:  31   342
 7:   6    56
 8:  78 44567
 9:   9  3211
10:  34  2342
11:  23     2

范围:

dt[, sapply(dt, function(x) all(x > 5 & x < 1000)), with=FALSE]
     X3
 1: 345
 2:  67
 3:  45
 4: 342
 5:  67
 6:  31
 7:   6
 8:  78
 9:   9
10:  34
11:  23

相关问题