如何扩展数据框架

时间:2017-09-05 17:13:04

标签: r dataframe

我有这样的数据:

df <- data.frame(year=c(1999,1999,1999,2000,2000,2001,2011,2011,2011,2011), class=c("A","B","C","A","C","A","B","C","D","E"), 
             n=c(10,20,30,12,15,40,50,55,60,5), occurs=c(0,1,3,4,2,0,0,11,12,2))



> df
   year class  n occurs
1  1999     A 10      0
2  1999     B 20      1
3  1999     C 30      3
4  2000     A 12      4
5  2000     C 15      2
6  2001     A 40      0
7  2011     B 50      0
8  2011     C 55     11
9  2011     D 60     12
10 2011     E  5      2

我想像这样扩展这些数据:

   year class  n occurs
1  1999     A  1      0
1  1999     A  2      0
1  1999     A  3      0
...
1  1999     A 10      0

2  1999     B  0     0
2  1999     B  1     0
2  1999     B  2     0
...  
2  1999     B 20     1
3  1999     C  1     1
3  1999     C  1     1
3  1999     C  1     0
3  1999     C  1     0
.. the rest of occurs is seq of zeros...because `n-occurs` = 27 zeros and seq of 3x `1`.

我希望按照n列所示扩展行n次,以便occurs列扩展为标记01 n-根据{{​​1}}列编号的次数,如果列occurs包含整数occurs和列5,则会有n = 10行(年份和类别)相同)和标记n occurs5 times zero

编辑:请注意5 times number one的新序列(仅occurs0的序列号)基于1的数量n-occurs0的数量由数字1确定。

2 个答案:

答案 0 :(得分:2)

使用构建do.call构造函数调用lapplydata.frame()调用

df_List <- lapply(seq(nrow(df)), FUN=function(d){
    occ <- c(rep(1, df$occurs[[d]]), rep(0, df$n[[d]]-df$occurs[[d]]))

    data.frame(year=df$year[[d]], class=df$class[[d]], n=seq(df$n[[d]]), occurs=occ)
})

finaldf <- do.call(rbind, df_List)
head(finaldf, 20)
#    year class  n occurs
# 1  1999     A  1      0
# 2  1999     A  2      0
# 3  1999     A  3      0
# 4  1999     A  4      0
# 5  1999     A  5      0
# 6  1999     A  6      0
# 7  1999     A  7      0
# 8  1999     A  8      0
# 9  1999     A  9      0
# 10 1999     A 10      0
# 11 1999     B  1      1
# 12 1999     B  2      0
# 13 1999     B  3      0
# 14 1999     B  4      0
# 15 1999     B  5      0
# 16 1999     B  6      0
# 17 1999     B  7      0
# 18 1999     B  8      0
# 19 1999     B  9      0
# 20 1999     B 10      0

答案 1 :(得分:0)

以下是与链接帖子here密切相关的基本R方法以及我上面的评论。答案是提供生成data.frame的前两列的方法。

dat <- data.frame(df[1:2][rep(1:nrow(df), df$n),],
                  n=sequence(df$n),
                  occurs=unlist(mapply(function(x, y) rep(0:1, c(x-y, y)), df$n, df$occurs)))

这里,使用该答案生成前2列。 n是使用序列生成的,并使用mapplyrep,返回带unlist的向量。这将1s放在最后。您可以使用1:0将1开头放在开头,或者将结果向量提供给sample中的mapply以获得1和0的随机排序。

我们可以检查data.frame是否有适当的行数:

nrow(dat) == sum(df$n)
[1] TRUE

的前15个观察结果
head(dat, 15)
    year class  n occurs
1   1999     A  1      0
1.1 1999     A  2      0
1.2 1999     A  3      0
1.3 1999     A  4      0
1.4 1999     A  5      0
1.5 1999     A  6      0
1.6 1999     A  7      0
1.7 1999     A  8      0
1.8 1999     A  9      0
1.9 1999     A 10      0
2   1999     B  1      0
2.1 1999     B  2      0
2.2 1999     B  3      0
2.3 1999     B  4      0
2.4 1999     B  5      0