[英]r subset rows by criteria and by factor group
我有這個帶有很多NA的data.frame:
df <- data.frame(a = rep(letters[1:3], each = 3),
b = c(NA, NA, NA, 1, NA, 3, NA, NA, 7))
df
> df
a b
1 a NA
2 a NA
3 a NA
4 b 1
5 b NA
6 b 3
7 c NA
8 c NA
9 c 7
我想將此數據幀子集化,以僅獲取具有不少於兩個值的因子組行,例如:
a b
1 b 1
2 b NA
3 b 3
我試過這個功能,但它不起作用:
subset(df, sum(!is.na(b)) < 1, by = a)
> [1] a b
<0 rows> (or 0-length row.names)
有什么建議嗎? (歡迎其他包裝解決方案)
我們可以使用data.table
。 if
邏輯向量的sum
(即非NA元素 - !is.na(b)
)大於, if
'data.frame'轉換為'data.table'( setDT(df)
),按'a'分組。 1,然后Subset Data.table。
library(data.table)
setDT(df)[,if(sum(!is.na(b))>1) .SD , by = a]
# a b
#1: b 1
#2: b NA
#3: b 3
或者使用dplyr
,使用相同的邏輯,在按'a'分組后,我們filter
行。
library(dplyr)
df %>%
group_by(a) %>%
filter(sum(!is.na(b))>1)
# a b
# <fctr> <dbl>
#1 b 1
#2 b NA
#3 b 3
或者在帶有ave
base R
df[with(df, ave(b, a, FUN = function(x) sum(!is.na(x))>1)!=0),]
一種方法是使用aggregate
。 計算每個唯一a
非NA
的元素數,然后從數據幀中設置這些行。
agg <- aggregate(b~a, df, function(x) length(!is.na(x)) >= 2)
df[df$a %in% agg[agg$b, "a"], ]
# a b
#4 b 1
#5 b NA
#6 b 3
另一種選擇是使用table
。
df[df$a %in% names(which(table(df$a, is.na(df$b))[,1] > 1)), ]
# a b
#4 b 1
#5 b NA
#6 b 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.