2014-02-22 41 views
1
df<-data.frame(a=1:100) 
sum(df$a>50) 
[1] 50 

我正在尋找的答案是51 + 52 ... 100的總和。我試着搜索,但只發現很差的問題/評分或導致Excel sumif。由於基於相對值的數值向量的總和(不計數個案)

+2

'a> 50'返回一個邏輯,即是/否'TRUE' /'FALSE'。由於R是矢量化的,你可以得到一個邏輯矢量。 'TRUE'可以強制爲1,'FALSE'爲0,所以你的總和是'1 + 1 + ... + 1'= 50.你需要首先對矢量進行子集化('a [51:100] )然後總結。 – rawr

回答

3

嘗試以下操作:

sum(subset(df,a>50)) 
1

Unsing條件中的「地址括號」沒有一個子集的作品。

sum(df[ df$a>50, ]) 
1

我認爲你的問題有幾件事情正在進行。我會盡量一次回答一個:

您創建了一個data.frame,但之後只將它用於該向量。讓我們試着只創建一個變量來回答你的問題:

a = 1:50 

您創建的數據,其中每個變量(例如X [10])等於指數(例如10)的值。正如我們下面看到的,這會導致一些混亂,因爲有多種方式可以在R.指數因此,讓我們用這個:

set.seed(0) 
a = sample(100, n=50) 

在你的問題,你叫合計(> 50)。首先,你應該試着瞭解什麼是50回報。這可能不是你的想法!

a > 50 
[1] TRUE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE FALSE 

即,a > 50返回應用(邏輯)試驗的結果 「大於50?」到每個向量a中的值。這是您經常在R中聽到的「向量化」。

請注意,在R中,可以將布爾(邏輯)向量作爲下標寫入向量。它只會返回的是TRUE的元素:

a[a > 50] 
[1] 90 56 88 85 96 61 58 60 66 87 82 63 74 51 62 86 69 54 77 92 81 64 83 91 

當然,則這些值可以被輸送到sum

sum(a[a > 50]) 
[1] 1776 

在某些時候,這將成爲你的第二天性。我推薦閱讀約翰庫克的偉大博客文章:Five Kinds of Subscripts in R - 它會幫助你回答各種相關的問題。