我正在创建随机数据。它应包含变量id
和val
,其中值不能在单个ID内重叠,但可以在id-s之间重叠。不同的id-s具有不同数量的值n
。我可以手动创建所需的结果:
n <- c(3,2,4)
data.frame(id=rep(letters[1:3], n),
val=c(sample(10, n[1]),
sample(10, n[2]),
sample(10, n[3])))
id val
1 a 5
2 a 10
3 a 4
4 b 9
5 b 10
6 c 10
7 c 5
8 c 2
9 c 9
我还可以设想不同的解决方案,包括循环群组和使用rbind
,或者使用rep
- 使id-s相应的次数。但是所有这些方法都很脏,并且可能无法扩展到许多变量和大数据。
有没有更清洁的方法来实现它?像(在dplyrish中)的东西:
data.frame(id=letters[1:3]) %>%
mutate(i = row_number()) %>%
group_by(id) %>%
summarize_into_df(id=id, val=sample(10, n[i]))
答案 0 :(得分:0)
您可以使用n
循环浏览lapply
,使用sample
创建列表列,然后将其删除:
library(dplyr)
library(tidyr)
n <- c(3,2,4)
data.frame(id = letters[1:length(n)]) %>%
mutate(val = lapply(n, sample, x=10)) %>%
unnest
# id val
#1 a 9
#2 a 4
#3 a 10
#4 b 4
#5 b 8
#6 c 5
#7 c 10
#8 c 8
#9 c 2
或者,如果没有使用任何与您所拥有的非常接近的软件包,只需将手动构造替换为unlist(lapply(...))
:
data.frame(id = rep(letters[1:length(n)], n),
val = unlist(lapply(n, sample, x=10)))