从数据框中的列中采样唯一行而不进行替换

Posted

技术标签:

【中文标题】从数据框中的列中采样唯一行而不进行替换【英文标题】:Sample unique rows from a column in a dataframe without replacement 【发布时间】:2019-07-21 20:45:10 【问题描述】:

我有一个dataframe,其中第一列包含唯一行IDs,第二列包含行之间通常不唯一的值。下面是一个使用iris 数据的简化示例:

> df <- as.data.frame(iris$Sepal.Length)
> id <- rownames(df)
> df <- cbind(id, df)
> colnames(df) <- c("id", "Sepal.Length")

> nrow(df)
[1] 150

> length(unique(df$id))
[1] 150

> length(unique(df$Sepal.Length))
[1] 35

> head(df,10)
   id Sepal.Length
1   1          5.1
2   2          4.9
3   3          4.7
4   4          4.6
5   5          5.0
6   6          5.4
7   7          4.6
8   8          5.0
9   9          4.4
10 10          4.9

我想从df$Sepal.Length 中随机抽样而不进行替换,以便抽样数据中的行具有唯一的行 ID 值。

> set.seed(22)
> df_sample <- df[sample(df$Sepal.Length, 10, replace=FALSE),]

但是,replace=FALSE 仍然给我带有重复 ID 的行:

> duplicated(df_sample$id)
 [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE

有没有办法在不替换的情况下对这些数据进行采样,以便返回唯一的行?我正在尝试专门对df$Sepal.Length 进行采样,因为我还想为此列提供概率向量。谢谢!

【问题讨论】:

抱歉,如果不清楚 - 我正在展示一个简化的示例,但我需要专门对 df$Sepal.Length 进行抽样,因为我最终想为此列提供概率向量。我将更新问题以更明确地说明这一点。 可能是df[sample(length(df$Sepal.Length), 10, replace=FALSE),]。如果没有,可能你没有清楚地解释问题。 @Suren 是的,这行得通,谢谢!这类似于 Shree 的回答。 是的,Shree 的回答与我的相似。如果他在我之前给出,我不会发表评论。 【参考方案1】:

这是一种方法-

df <- data.frame(id = 1:nrow(iris), Sepal.Length = iris$Sepal.Length)

df_sample <- df[sample(nrow(df), 10, replace = F), ]

duplicated(df_sample$id)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

【讨论】:

【参考方案2】:

您可以使用 dplyr 中的 sample_n()sample_frac() 函数对数据框执行此操作。它使采样变得更加容易。

sample_n(iris, 100, replace = FALSE)
sample_frac(iris, .75, replace = FALSE)

【讨论】:

谢谢!我会接受 Shree 的回答,因为它需要对我现有的代码进行最少的更改,但我以后会记住这一点。

以上是关于从数据框中的列中采样唯一行而不进行替换的主要内容,如果未能解决你的问题,请参考以下文章

逻辑操作:从数据框中的列中选择两个值

什么函数允许我根据R中列中的值从数据框中的列中提取数据?

从数据框中的列中获取第一个和最后一个值

如何从python中的pandas数据框中的列中提取关键字(字符串)

从 pyspark 数据框中的列中提取特定字符串

如何从熊猫数据框中的列中删除字符串值