我有一个包含70列的数据集。
我想对数据集的所有行进行子集化,其中第5到70列中的任何一个值都大于值7。
我尝试了以下代码,但是,我不需要TRUE / FALSE值。我只希望那些不符合从数据框中删除的条件的行
subset <- (data[, 5:70] > 7)
答案 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
中的dplyr
与any_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)
您可以将apply
与MARGIN = 1
和any
结合使用。
可复制的示例:
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?