簡體   English   中英

降低一個列r的缺失值的因子水平

[英]drop levels of factor for which there is one missing value for one column r

我想刪除任何一個因子級別的出現,其中一行包含缺失值

例:

ID var1 var2
1  1    2
1  NA   3
2  1    2
2  2    4

所以,在這個假設中,剩下的將是:

ID var1 var2
2  1    2
2  2    4

她的可能data.table解決方案(對不起@rawr)

library(data.table)
setDT(df)[, if (all(!is.na(.SD))) .SD, ID]
#    ID var1 var2
# 1:  2    1    2
# 2:  2    2    4

如果你只想檢查var1那么

df[, if (all(!is.na(var1))) .SD, ID]
#    ID var1 var2
# 1:  2    1    2
# 2:  2    2    4

假設在兩個var列中都會出現NAs

 df[with(df, !ave(!!rowSums(is.na(df[,-1])), ID, FUN=any)),]
 #   ID var1 var2
 #3  2    1    2
 #4  2    2    4

或者,如果它僅特定於var1

 df[with(df, !ave(is.na(var1), ID, FUN=any)),]
 #  ID var1 var2
 #3  2    1    2
 #4  2    2    4

或者使用dplyr

 library(dplyr)
 df %>% 
     group_by(ID) %>%
     filter(all(!is.na(var1)))
 #   ID var1 var2
 #1  2    1    2
 #2  2    2    4

數據

 df <- structure(list(ID = c(1L, 1L, 2L, 2L), var1 = c(1L, NA, 1L, 2L
 ), var2 = c(2L, 3L, 2L, 4L)), .Names = c("ID", "var1", "var2"
 ), class = "data.frame", row.names = c(NA, -4L))

這是基礎R中的另一個選項。它將檢查所有列的NA。

df[!df$ID %in% df$ID[rowSums(is.na(df)) > 0],]
#  ID var1 var2
#3  2    1    2
#4  2    2    4

如果您只想簽入“var1”列,您可以執行以下操作:

df[!with(df, ID %in% ID[is.na(var1)]),]
#  ID var1 var2
#3  2    1    2
#4  2    2    4

data.table的當前開發版本中,有一個針對data.tables的na.omit的新實現,它采用了cols =invert = arguments。

cols =允許指定要查找NAs的列。 invert = TRUE返回NA行,而不是省略它們

您可以按照這些說明安裝devel版本。 或者你可以在CRAN等待1.9.6。 使用它,我們可以做到:

require(data.table) ## 1.9.5+
setkey(setDT(df), ID)
df[!na.omit(df, invert = TRUE)]
#    ID var1 var2
# 1:  2    1    2
# 2:  2    2    4

這是如何工作的:

  • setDT通過引用將setDT轉換為data.table。

  • setkey按提供的列對data.table進行排序,並將這些列標記為鍵列,以便我們可以執行連接。

  • na.omit(df, invert = TRUE)只給出那些在任何地方都有NA行。

  • X[!Y]通過連接鍵列ID執行anit-join,並返回與ID = 1 (來自Y )不匹配的所有行。 查看這篇文章 ,詳細了解data.table的連接。

HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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