R: Insert multiple rows (variable number) in data frame

三世轮回 提交于 2019-12-05 11:05:37
A5C1D2H2I1M1N2O1R2T1

You can try using the "data.table" package which would let you use "length<-" to expand out your rows.

Demo:

library(data.table)
as.data.table(dft)[, lapply(.SD, `length<-`, 4), by = x]
##    x  y  z
## 1: a  2  2
## 2: a  4  3
## 3: a NA NA
## 4: a NA NA
## 5: b  5  4
## 6: b  2  5
## 7: b  6  6
## 8: b NA NA

Update

Upon provocation by Thela-the-taunter™, if you want to stick with base R, perhaps you can create a function like the following:

naRowsByGroup <- function(indf, group, rowsneeded) {
  do.call(rbind, lapply(split(indf, indf[[group]]), function(x) {
    x <- data.frame(lapply(x, `length<-`, rowsneeded))
    x[group] <- x[[group]][1]
    x
  }))
}

Usage would then be:

naRowsByGroup(dft, 1, 4)
#   x  y  z
# 1 a  2  2
# 2 a  4  3
# 3 a NA NA
# 4 a NA NA
# 5 b  5  4
# 6 b  2  5
# 7 b  6  6
# 8 b NA NA

Sample data:

x = c("a","a","b","b","b")
y = c(2,4,5,2,6)
z = c(2,3,4,5,6)
dft = data.frame(x,y,z)
dft = data.frame(x=c("a","a","b","b","b"),
                 y=c(2,4,5,2,6))

x <- 4 - table(dft$x)
dd <- rbind(dft, data.frame(x = rep(names(x), x), y = NA))
dd[order(dd$x), ]

#   x  y
# 1 a  2
# 2 a  4
# 6 a NA
# 7 a NA
# 3 b  5
# 4 b  2
# 5 b  6
# 8 b NA

And if you need, maybe you can add something if you have variables with >= 4 rows already like this

dft =data.frame(x=c("a","a","b","b","b",rep('c',6)), y=1)
x <- 4 - table(dft$x)
x[x < 0] <- 0
dd <- rbind(dft, data.frame(x = rep(names(x), x), y = NA))
dd[order(dd$x), ]

#    x  y
# 1  a  1
# 2  a  1
# 12 a NA
# 13 a NA
# 3  b  1
# 4  b  1
# 5  b  1
# 14 b NA
# 6  c  1
# 7  c  1
# 8  c  1
# 9  c  1
# 10 c  1
# 11 c  1

For an arbitrary number of columns:

dft = data.frame(x=c("a","a","b","b","b"),
                 y=c(2,4,5,2,6),
                 z=1,
                 zz=2)

x <- 4 - table(dft$x)
dd <- dft[1:sum(x), ]
dd[, names(dft)] <- NA
dd$x <- rep(names(x), x)
dd <- rbind(dft, dd)
dd[order(dd$x), ]

#   x  y  z zz
# 1 a  2  1  2
# 2 a  4  1  2
# 6 a NA NA NA
# 7 a NA NA NA
# 3 b  5  1  2
# 4 b  2  1  2
# 5 b  6  1  2
# 8 b NA NA NA
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!