我有一个100,000行的大数据帧,我想添加一个列,其中值是基于数据帧中的通用名称的另一个数据帧的子集的样本。可能更容易用例子来解释......
largeDF <- data.frame(colA = c('a', 'b', 'b', 'a', 'a', 'b'),
colB = c('x', 'y', 'y', 'x', 'y', 'y'),
colC = 1:6)
sampleDF <- data.frame(colA = c('a','a','a','a','b','b','b','b','b','b'),
colB = c('x','x','y','y','x','y','y','y','y','y'),
sample = 1:10)
然后,我想向sample
添加一个新列largeDF
,这是sample
中sampleDF
列的随机样本,用于{{1}的相应子集}和colA
。
例如,对于第一行,值为colB
和a
,因此该值将是x
或1
的随机样本,用于下一行(2
和b
)它将是y
的随机样本。
所以我们最终会得到类似的东西:
6, 7, 8, 9 or 10
任何帮助将不胜感激!
答案 0 :(得分:1)
使用dplyr
...(这会引发一些警告,但无论如何似乎都有效。)
library(dplyr)
largeDF <- largeDF %>% group_by(colA,colB) %>%
mutate(sample=sample(sampleDF$sample[sampleDF$colA==colA & sampleDF$colB==colB],
size=n(),replace=TRUE))
largeDF
colA colB colC sample
<fctr> <fctr> <int> <int>
1 a x 1 2
2 b y 2 6
3 b y 3 9
4 a x 4 1
5 a y 5 4
6 b y 6 9
答案 1 :(得分:1)
你可以这样做:
largeDF$sample <- apply(largeDF,1,function(a)
with(sampleDF, sample(sampleDF[colA==a[1] & colB==a[2],]$sample,1)))
答案 2 :(得分:0)
我不太明白这个问题,但似乎你只是在大数据框中添加一个新的列,它只是采样的&#34;样本&#34;子样本中的列... 看看下面的代码是否能让您了解所需的功能:
cbind.data.frame(largeDF, sample = sample(sampleDF$sample, nrow(largeDF)))
# colA colB colC sample
#1 a x 1 9
#2 b y 2 10
#3 b y 3 1
#4 a x 4 3
#5 a y 5 6
#6 b y 6 7
答案 3 :(得分:0)
我认为这是一个可能的解决方案......
library(dplyr)
largeDF_sample <- sapply(1:nrow(largeDF), function(x) {
sampleDF_part = filter(sampleDF, colA==largeDF$colA[x] & colB==largeDF$colB[x])
return(sample(sampleDF_part$sample)[1])
})
largeDF$sample <- largeDF_sample