2

一部のユニット(ユニット1..5など)からの20の異なるテストステップのテスト値を持つデータフレームがありますさらに、下限と上限(llとul)を持つ2つの列があります

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

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つの機能は、それらが提供する利便性のためにかなりうまく機能していると思います!

于 2012-10-03T10:19:53.453 に答える
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 に答える