[英]R changing variable value of one factor level to represent value mean of factor levels by day
[英]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.