2

我有一个数据框,其中包含来自某些单元(例如单元 1..5)的 20 个不同测试步骤的测试值此外,我有 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) 的每一行的值的计数?

4

2 回答 2

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
于 2012-10-03T09:23:21.457 回答
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

我认为这两个功能非常方便,因为它们提供了便利!

于 2012-10-03T10:19:53.453 回答