子集行的列值大于阈值

时间:2019-04-09 00:59:46

标签: r dataframe subset

我有一个包含70列的数据集。

我想对数据集的所有行进行子集化,其中第5到70列中的任何一个值都大于值7。

我尝试了以下代码,但是,我不需要TRUE / FALSE值。我只希望那些不符合从数据框中删除的条件的行

subset <- (data[, 5:70] > 7)

3 个答案:

答案 0 :(得分:3)

说这是您的数据

dat <- data.frame(X=sample(1:10, 10, T), 
                  Y = sample(1:10, 10, T), 
                  stringsAsFactors = F)

您可以使用subset命令提取所需内容:

sub <- subset(dat, X > 7 | Y > 7)

答案 1 :(得分:3)

我们可以使用rowSums

data[rowSums(data[5:70] > 7) > 0, ]

或与subset

subset(data, rowSums(data[5:70] > 7) > 0)

我们还可以将filter_at中的dplyrany_vars一起使用

library(dplyr)
data %>% filter_at(vars(5:70), any_vars(. > 7))

使用来自mtcars的可复制数据(@Maurits Evers的盗版想法)

mtcars[rowSums(mtcars[3:11] > 300) > 0, ]

#                     mpg cyl disp  hp drat    wt  qsec vs am gear carb
#Hornet Sportabout   18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#Duster 360          14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
#Cadillac Fleetwood  10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
#Lincoln Continental 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
#Chrysler Imperial   14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
#Dodge Challenger    15.5   8  318 150 2.76 3.520 16.87  0  0    3    2
#AMC Javelin         15.2   8  304 150 3.15 3.435 17.30  0  0    3    2
#Camaro Z28          13.3   8  350 245 3.73 3.840 15.41  0  0    3    4
#Pontiac Firebird    19.2   8  400 175 3.08 3.845 17.05  0  0    3    2
#Ford Pantera L      15.8   8  351 264 4.22 3.170 14.50  0  1    5    4
#Maserati Bora       15.0   8  301 335 3.54 3.570 14.60  0  1    5    8

使用filter_at也会得到相同的输出

mtcars %>% filter_at(vars(3:11), any_vars(. > 300))

答案 2 :(得分:1)

您可以将applyMARGIN = 1any结合使用。

可复制的示例:

mtcars[apply(mtcars, 1, function(x) any(x > 300)), ]
#                     mpg cyl disp  hp drat    wt  qsec vs am gear carb
#Hornet Sportabout   18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#Duster 360          14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
#Cadillac Fleetwood  10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
#Lincoln Continental 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
#Chrysler Imperial   14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
#Dodge Challenger    15.5   8  318 150 2.76 3.520 16.87  0  0    3    2
#AMC Javelin         15.2   8  304 150 3.15 3.435 17.30  0  0    3    2
#Camaro Z28          13.3   8  350 245 3.73 3.840 15.41  0  0    3    4
#Pontiac Firebird    19.2   8  400 175 3.08 3.845 17.05  0  0    3    2
#Ford Pantera L      15.8   8  351 264 4.22 3.170 14.50  0  1    5    4
#Maserati Bora       15.0   8  301 335 3.54 3.570 14.60  0  1    5    8

或者您的情况

data[apply(data[5:70], 1, function(x) any(x > 7)), ] 

使用直接[索引而不是subset更好(更快),请参见例如Faster way to subset on rows of a data frame in R?