簡體   English   中英

R消除了比dplyr或基本子集更多的觀察結果

[英]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多個觀察值。

因此,我的問題是:

  • 我正在使用的數據框可能會發生一些奇怪的事情(不幸的是,我無法給您一部分數據)
  • 第二,我的編碼有問題嗎?
  • 最后,R在后台到底是做什么的? 由於它可以根據匹配字符串和is.na()函數的確切條件過濾掉這些觀察值,而在使用否定符號時完全可以做其他事情。

在這種情況下,您的邏輯無法引用。 隨后執行兩個過濾器語句就像執行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.

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