![](/img/trans.png)
[英]Randomly select observations within a group using dplyr/base function R
[英]R removes more observations than it should with dplyr or base subset
我對dplyr的filter()函數和/或R中的基本subset()函數有疑問。基本上,當我使用filter()或subset()時,我可以基於兩個條件提取觀察值我需要。 例如,這是我到目前為止一直在使用的:
df %>% filter(Axis_1_1 == "Diagnostic of function on axis1 postponed") %>% filter(is.na(diagnostic_code9))
這給了我同時滿足這兩個條件的正確數量的觀測值,即總共23992個中的92個。
但是,當我使用否定符號不將這些觀察值包括在當前數據框中時,R將刪除大約8000個額外的觀察值。 因此,最終結果是用否定“!”過濾后剩下的15992個觀測值。 使用的標志。 例:
df %>% filter(Axis_1_1 != "Diagnostic of function on axis1 postponed") %>% filter(!is.na(diagnostic_code9))
如第一個示例所述,使用基數R的簡單子集給我同樣的錯誤最終結果,同時它設法找到滿足條件的正確92個觀測值。
subset(df, df$Axis1_1 == "Diagnostic of function on axis1 postponed" & is.na(diagnostic_code9))
我的數據框包含112個變量和當前設置下的23900多個觀察值。
因此,我的問題是:
在這種情況下,您的邏輯無法引用。 隨后執行兩個過濾器語句就像執行AND操作。 考慮以下示例
df <- data.frame(a=c(1,1,1,1,2,2,2, 2),
b=c(NA,NA,5,5,5,5,5,NA))
df %>% filter(a==1) %>% filter(is.na(b))
# a b
# 1 1 NA
# 2 1 NA
df %>% filter(a!=1) %>% filter(!is.na(b))
# a b
# 1 2 5
# 2 2 5
# 3 2 5
請注意,即使它們不在第一個輸出中,也不會返回a = 1,b = 5的行,因為您的第一個過濾器( filter(!=1)
)消除了它們。
因此,如果您將兩個過濾器視為A和B,則在第一種情況下,您正在做A和B。這與
df %>% filter(a==1 & is.na(b))
# a b
# 1 1 NA
# 2 1 NA
但是在第二個步驟中,您正在執行NOT A和NOTB。這不是等效的。 根據德摩根定律 ,您不需要A或B。因此,請嘗試
df %>% filter(a!=1 | !is.na(b))
# a b
# 1 1 5
# 2 1 5
# 3 2 5
# 4 2 5
# 5 2 5
# 6 2 NA
或等效方式(請注意,在括號中將NOT( !
)應用於整個表達式)
df %>% filter(!(a==1 & is.na(b)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.