【发布时间】:2017-03-14 00:33:41
【问题描述】:
我有以下玩具数据集
set.seed(100)
df <- data.frame(ID = rep(1:5, each = 3),
value = sample(LETTERS, 15, replace = TRUE),
weight = rep(c(0.1, 0.1, 0.5, 0.2, 0.1), each = 3))
df
ID value weight
1 1 I 0.1
2 1 G 0.1
3 1 O 0.1
4 2 B 0.1
5 2 M 0.1
6 2 M 0.1
7 3 V 0.5
8 3 J 0.5
9 3 O 0.5
10 4 E 0.2
11 4 Q 0.2
12 4 W 0.2
13 5 H 0.1
14 5 K 0.1
15 5 T 0.1
其中每个 ID 是一个单独的受访者,回答 3 个问题(在实际数据集中,回答的问题数量是可变的,因此我不能依赖每个 ID 的特定行数)。
我想创建一个新的(更大的)数据集,它根据weight 中的权重从各个 ID 中采样。
probs <- data.frame(ID = unique(df$ID))
probs$prob <- NA
for(i in 1:nrow(probs)){
probs$prob[i] <- df[df$ID %in% probs$ID[i],]$weight[1]
}
probs$prob <- probs$prob / sum(probs$prob)
sampledIDs <- sample(probs$ID, size = 10000, replace = TRUE, prob = probs$prob)
head(sampledIDs,10)
[1] 4 3 3 3 4 4 2 4 2 3
从 ID 的概率抽样转移到实际创建新的 data.frame 让我很难过。我试过了
dfW <- df[df$ID %in% sampledIDs,]
但这显然没有考虑到 ID 重复的事实。我也试过循环:
dfW <- df[df$ID == sampledIDs[1],]
for(i in 2:length(sampledIDs)){
dfW <- rbind(dfW, df[df$ID == sampledIDs[i],])
}
但是对于大型数据集,这非常痛苦。
任何帮助将不胜感激。
(另外,如果有更简单的方法来进行 ID 的概率选择,那也太好了!)
【问题讨论】:
-
你试过包
sampling吗?
标签: r