所以,我有一个可以工作的代码:
minimum_ozone <- 65
ozone <- subset(ozone, ozone[2] >= minimum_ozone | ozone[3] >= minimum_ozone | ozone[4] >= minimum_ozone | ozone[5] >= minimum_ozone | ozone[6] >= minimum_ozone | ozone[7] >= minimum_ozone
| ozone[8] >= minimum_ozone | ozone[9] >= minimum_ozone | ozone[10] >= minimum_ozone | ozone[11] >= minimum_ozone | ozone[12] >= minimum_ozone | ozone[13] >= minimum_ozone
| ozone[14] >= minimum_ozone | ozone[15] >= minimum_ozone | ozone[16] >= minimum_ozone | ozone[17] >= minimum_ozone | ozone[18] >= minimum_ozone | ozone[19] >= minimum_ozone
| ozone[20] >= minimum_ozone | ozone[21] >= minimum_ozone | ozone[22] >= minimum_ozone | ozone[23] >= minimum_ozone | ozone[24] >= minimum_ozone | ozone[25] >= minimum_ozone)
然而,这段代码看起来太笨重了。有没有更短的代码/更快的方式来执行这个?
发布于 2018-06-09 07:05:48
您应该能够以快速运行、矢量化的方式完成此操作,而无需明确地键入每个比较。以下是几个选项:
# compare the whole data.frame to min and sum the logical values in each row
res1 <- ozone[rowSums(ozone[2:5] >= minimum_ozone) > 0,]
# use pmax to get the row maximum and then compare to min
res2 <- ozone[do.call(pmax, ozone[2:5]) >= minimum_ozone,]
# use Reduce and | (or) to do the same process you wrote out long-hand
res3 <- ozone[Reduce(`|`, lapply(ozone[2:5], `>=`, minimum_ozone)),]
用一些虚构的数据来测试它:
# example data
minimum_ozone <- 65
set.seed(1)
ozone <- data.frame(replicate(5, sample(1:100,5)))
names(ozone) <- paste0("v",1:5)
# long-hand solution
out <- subset(
ozone,
ozone[2] >= minimum_ozone |
ozone[3] >= minimum_ozone |
ozone[4] >= minimum_ozone |
ozone[5] >= minimum_ozone
)
identical(out, res1)
#[1] TRUE
identical(out, res2)
#[1] TRUE
identical(out, res3)
#[1] TRUE
发布于 2018-06-09 06:43:39
set.seed(1)
ozone <- as.data.frame(matrix(sample(40:70, 50, replace=TRUE), 10))
ozone
# V1 V2 V3 V4 V5
# 1 48 46 68 54 65
# 2 51 45 46 58 60
# 3 57 61 60 55 64
# 4 68 51 43 45 57
# 5 46 63 48 65 56
# 6 67 55 51 60 64
# 7 69 62 40 64 40
# 8 60 70 51 43 54
# 9 59 51 66 62 62
# 10 41 64 50 52 61
minimum_ozone <- 65
ozone[which(apply(ozone, 1, max) > minimum_ozone), ]
# V1 V2 V3 V4 V5
# 1 48 46 68 54 65
# 4 68 51 43 45 57
# 6 67 55 51 60 64
# 7 69 62 40 64 40
# 8 60 70 51 43 54
# 9 59 51 66 62 62
https://stackoverflow.com/questions/50768913
复制相似问题