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))
Jilberのソリューションとこれら2つを2,000,000行のデータセットでベンチマークすると、次の結果が得られます。
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
これらの2つの機能は、それらが提供する利便性のためにかなりうまく機能していると思います!