我会使用within()
这个,遵循与@Jilber 的回答相同的逻辑:
# First, use set.seed to make your example reproducible
set.seed(1)
data <- data.frame(
ll=round(runif(5, 5, 15)),
ul=round(runif(5, 80, 95)),
unit1=sample(1:100, 5, TRUE),
unit2=sample(1:100, 5, TRUE),
unit3=sample(1:100, 5, TRUE),
unit4=sample(1:100, 5, TRUE),
unit5=sample(1:100, 5, TRUE)
)
data
# ll ul unit1 unit2 unit3 unit4 unit5
# 1 8 93 21 50 94 39 49
# 2 9 94 18 72 22 2 60
# 3 11 90 69 100 66 39 50
# 4 14 89 39 39 13 87 19
# 5 7 81 77 78 27 35 83
该within
功能使您可以方便地添加新列。
within(data, {
below = rowSums(data[-c(1:2)] < ll)
above = rowSums(data[-c(1:2)] > ul)
})
# ll ul unit1 unit2 unit3 unit4 unit5 above below
# 1 8 93 21 50 94 39 49 1 0
# 2 9 94 18 72 22 2 60 0 1
# 3 11 90 69 100 66 39 50 1 0
# 4 14 89 39 39 13 87 19 0 1
# 5 7 81 77 78 27 35 83 1 0
或者,您也可以使用transform()
来实现相同的输出:
transform(data,
below = rowSums(data[-c(1:2)] < ll),
above = rowSums(data[-c(1:2)] > ul))
在 2,000,000 行数据集上对 Jilber 的解决方案和这两个解决方案进行基准测试,结果如下:
test replications elapsed relative user.self sys.self
3 jilber 3 33.586 1.000 31.490 1.916
1 within 3 34.493 1.027 32.542 1.584
2 transform 3 33.813 1.007 31.870 1.828
我认为这两个功能非常方便,因为它们提供了便利!