簡體   English   中英

r按標准和因子組划分的子集行

[英]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 計算每個唯一aNA的元素數,然后從數據幀中設置這些行。

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.

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