簡體   English   中英

在子集函數和邏輯運算符中使用多個條件

[英]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()調用只返回bf11TRUE行(或者計算為TRUE )。

你能寫的東西會是這樣的:

subset(dat, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)

這給出了與我之前的subset()調用相同的結果。 關鍵是你需要進行一系列單一比較,而不是一系列選項的比較。 但正如您所看到的, %in%在這種情況下更有用,更簡潔。 另請注意,我必須使用| 因為我想的每個元素進行比較bf1112 ,和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM