[英]Using multiple criteria in subset function and logical operators
如果我想在R中選擇數據子集,我可以使用子集函數。 我想基於與少數幾個標准匹配的數據進行分析,例如,某個變量是1,2或3。我嘗試過
myNewDataFrame <- subset(bigfive, subset = (bigfive$bf11==(1||2||3)))
它總是只選擇與第一個標准匹配的值,這里1.我的假設是它將從1開始,如果它的評估為“false”,它將繼續到2而不是3,如果沒有匹配==之后的語句為“false”,如果其中一個匹配,則為“true”。
我得到了正確的結果
newDataFrame <- subset(bigfive, subset = (bigfive$bf11==c(1,2,3)))
但我希望能夠通過邏輯運算符選擇數據,所以:為什么第一種方法不起作用?
正確的運算符是%in%
here。 以下是虛擬數據的示例:
set.seed(1)
dat <- data.frame(bf11 = sample(4, 10, replace = TRUE),
foo = runif(10))
贈送:
> head(dat)
bf11 foo
1 2 0.2059746
2 2 0.1765568
3 3 0.6870228
4 4 0.3841037
5 1 0.7698414
6 4 0.4976992
bf11
等於集合1,2,3
任何一個的dat
子集如下使用%in%
:
> subset(dat, subset = bf11 %in% c(1,2,3))
bf11 foo
1 2 0.2059746
2 2 0.1765568
3 3 0.6870228
5 1 0.7698414
8 3 0.9919061
9 3 0.3800352
10 1 0.7774452
至於為什么你的原件不起作用,打破它看看問題。 看看1||2||3
評估結果為:
> 1 || 2 || 3
[1] TRUE
你會得到同樣的使用|
代替。 因此, subset()
調用只返回bf11
為TRUE
行(或者計算為TRUE
)。
你能寫的東西會是這樣的:
subset(dat, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)
這給出了與我之前的subset()
調用相同的結果。 關鍵是你需要進行一系列單一比較,而不是一系列選項的比較。 但正如您所看到的, %in%
在這種情況下更有用,更簡潔。 另請注意,我必須使用|
因為我想的每個元素進行比較bf11
對1
, 2
,和3
,反過來。 相比:
> with(dat, bf11 == 1 || bf11 == 2)
[1] TRUE
> with(dat, bf11 == 1 | bf11 == 2)
[1] TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE
對於您的示例,我認為以下應該有效:
myNewDataFrame <- subset(bigfive, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)
有關詳細信息,請參閱?subset
的示例。 只是為了演示,一個更復雜的邏輯子集將是:
data(airquality)
dat <- subset(airquality, subset = (Temp > 80 & Month > 5) | Ozone < 40)
正如Chase所指出的那樣, %in%
在你的例子中更有效:
myNewDataFrame <- subset(bigfive, subset = bf11 %in% c(1, 2, 3))
正如Chase也指出的那樣,請確保您了解|
之間的區別 和||
。 要查看運營商的幫助頁面,請使用?'||'
,引用運營商的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.