【问题标题】:Sample from different columns in R来自 R 中不同列的样本
【发布时间】:2018-07-05 10:51:18
【问题描述】:

假设我有一个概率向量

prob=c(0.1,0.8,0.1)

和一个数据框:df=cbind(c("A","B","A"),c(1,2,3),c("q","v","z"))

我想对 df 中的 n 对象进行替换,第一列的概率为 0.1,第二列的概率为 0.8,第三列的概率为 0.1

【问题讨论】:

  • 您是从列中采样 n 列还是 n 个元素?一个样本包含整个列还是一个样本仅包含一个元素,例如“A”??
  • 我想对 n 个元素进行采样,10% 必须来自第一列,80% 来自第二列,10% 来自最后一列
  • Psst...我想你想用data.frame() 替换那个cbind() - 你现在得到一个matrix

标签: r dataframe sample


【解决方案1】:

我们将取消列出 data.frame,并即时修改我们的 prob 向量,使其具有适当的长度。

df <- data.frame(c("A","B","A"), c(1,2,3), c("q","v","z"), stringsAsFactors = F)

n <- 5
set.seed(1)
unname(sample(unlist(df), n, replace = TRUE, prob= rep(prob, each = nrow(df))))
# [1] "3" "1" "A" "z" "2"

如果你真的从矩阵而不是 data.frame 开始,那就有点短了:

df=cbind(c("A","B","A"),c(1,2,3),c("q","v","z"))
set.seed(1)
sample(df, n, replace = TRUE, prob= rep(prob, each = nrow(df)))
# [1] "3" "1" "A" "z" "2"

来自列表(回答 cmets)

l =list(c("A","B"),c(1,2,3),c("q","v","z","w"))
set.seed(1)
sample(unlist(l), n, replace = TRUE, prob= rep(prob/lengths(l), lengths(l)))
# [1] "3" "2" "1" "v" "3" "B" "q"

【讨论】:

  • 如果不是数据框而是列表,其中每列的长度不同?
  • sample.int(length(x), size, replace, prob) 中的错误:概率数不正确
【解决方案2】:

这是基于样本概率在一列内是一致的假设:

我们首先使用向量prob 中的概率对n 列位置进行采样;

df=cbind(c("A","B","A"),c(1,2,3),c("q","v","z"))
prob=c(0.1,0.8,0.1)
n = 10

set.seed(1)
colselect <- sample(1:ncol(df), size = n, replace = TRUE, prob = prob)

[1] 2 2 2 1 2 3 1 2 2 2

然后我们遍历列位置并从各自的列中分别采样一个元素:

sapply(colselect, function(x) sample(df[,x], 1))

[1] "1" "1" "3" "B" "3" "v" "A" "3" "2" "3"

【讨论】:

  • 我没有说每一列的概率是一致的,我问这个问题是因为我想从每一列中以特定的概率进行抽样
  • 是的,但是从一个特定列中采样哪个值的概率是一致的,或者不是吗?您以特定概率对特定列进行采样,但您并不关心要从该列中采样哪个值。
  • 这是我找到的确切解决方案。使用概率来决定要从每列中采样多少元素,然后从每列中采样。通过在没有约束的情况下一次取一项来解决列内的替换。 @gldzzzz - 除非你添加更多细节 - 也许通过给我们一个例子 - 那么完全不清楚为什么这不能解决你的问题。
猜你喜欢
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2017-08-13
  • 2013-12-29
  • 1970-01-01
相关资源
最近更新 更多