2012-10-03 60 views
2

我有一個數據幀,其中有些單元的測試值是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)算什麼呢?

回答

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 
+0

感謝您的快速回答 – user1716533

+0

+1爲好的直接解決方案。我已經在我的答案中將它適用於「轉換」和「內部」,在這些情況下,我都認爲這些功能非常有用。 – A5C1D2H2I1M1N2O1R2T1

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,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 

我認爲這兩個功能非常適合他們提供的便利!

+0

感謝這很短,它適合我。 同樣,set.seed(1)的提示很好, – user1716533

+0

@ user1716533,當然。請記住,您可以將您的種子設置爲您想要的任何值。 – A5C1D2H2I1M1N2O1R2T1

+0

對於使用內部和變換以及基準測試的良好實現+1。 –

相關問題