我有一个数据帧,测试值为20个不同的测试步骤,来自某些单位(例如,单位1 ... 5) 另外,我有2列具有下限和上限(ll和ul)
data <- data.frame(
ll=round(runif(20,5,15)),
ul=round(runif(20,80,95)),
unit1=sample(1:100,20,TRUE),
unit2=sample(1:100,20,TRUE),
unit3=sample(1:100,20,TRUE),
unit4=sample(1:100,20,TRUE),
unit5=sample(1:100,20,TRUE)
)
如何获得低于下限(ll)的每一行的值计数以及高于上限(ul)的数量?
答案 0 :(得分:1)
试试这个:
below <- rowSums(data[,-c(1,2)] < data[,'ll']) # below
above <- rowSums(data[,-c(1,2)] > data[,'ul']) # above
DF <- cbind(data, below, above) # altogether
head(DF)
ll ul unit1 unit2 unit3 unit4 unit5 below above
1 10 82 75 10 24 80 60 0 0
2 13 87 60 20 4 94 31 1 1
3 8 85 58 9 98 94 65 0 2
4 11 95 68 45 5 38 76 1 0
5 11 87 15 79 5 43 67 1 0
6 11 89 33 6 18 1 22 2 0
答案 1 :(得分:1)
我会使用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
我认为这两个功能非常适合他们提供的便利!