在 R 中,从 df 中采样 n 行,其中某个列具有非 NA 值(有条件地采样)

log*_*min 12 random r subset dataframe

背景

这是一个玩具df

df <- data.frame(ID = c("a","b","c","d","e","f"), 
                gender = c("f","f","m","f","m","m"), 
                zip = c(48601,NA,29910,54220,NA,44663),stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

如您所见,我NAzip列中有几个值。

问题

我正在尝试从中随机采样 2 整行df- 但我希望它们zip是不为空的行。

我试过的

这段代码为我提供了一个基本的(即无条件的)随机样本:

df2 <- df[sample(nrow(df), 2), ]
Run Code Online (Sandbox Code Playgroud)

但是,当然,这只能让我实现目标的一半——很多时候它会返回一个NA值为 in的行zip。此代码尝试添加条件:

df2 <- df[sample(nrow(df$zip != NA), 2), ]
Run Code Online (Sandbox Code Playgroud)

我想我已经接近了,但这会产生错误invalid first argument

有任何想法吗?

akr*_*run 9

我们可以用 is.na

tmp <- df[!is.na(df$zip),]
> tmp[sample(nrow(tmp), 2),]
Run Code Online (Sandbox Code Playgroud)


Tho*_*ing 8

我们可以使用rownames+na.omit对行进行采样

> df[sample(rownames(na.omit(df["zip"])), 2),]
  ID gender   zip
3  c      m 29910
4  d      f 54220
Run Code Online (Sandbox Code Playgroud)


Tar*_*Jae 6

这是一个基本的 R 解决方案 complete.cases()

# define a logical vector to identify NA
x <- complete.cases(df)

# subset only not NA values
df_no_na <- df[x,]

# do the sample
df_no_na[sample(nrow(df_no_na), 2),]
Run Code Online (Sandbox Code Playgroud)

输出:

  ID gender   zip
3  c      m 29910
6  f      m 44663
Run Code Online (Sandbox Code Playgroud)