一种干净的方法,用于按组添加可变长度值到数据

时间:2017-12-10 03:59:13

标签: r dataframe dplyr

我正在创建随机数据。它应包含变量idval,其中值不能在单个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]))

1 个答案:

答案 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)))