我有这样的数据:
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
列扩展为标记0
或1
n-根据{{1}}列编号的次数,如果列occurs
包含整数occurs
和列5
,则会有n = 10
行(年份和类别)相同)和标记n
occurs
和5 times zero
。
编辑:请注意5 times number one
的新序列(仅occurs
和0
的序列号)基于1
的数量n-occurs
和0
的数量由数字1
确定。
答案 0 :(得分:2)
使用构建的do.call
构造函数调用lapply
和data.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是使用序列生成的,并使用mapply
和rep
,返回带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