假设您有一个包含四列的数据框:
dat <- data.frame(A = rnorm(5), B = rnorm(5), C = rnorm(5), D = rnorm(5))
Run Code Online (Sandbox Code Playgroud)
并且您希望在数据框中的每个列之间插入一个空列,以便输出为:
A A1 B B1 C C1 D D1
1 1.15660588 NA 0.78350197 NA -0.2098506 NA 2.07495662 NA
2 0.60107853 NA 0.03517539 NA -0.4119263 NA -0.08155673 NA
3 0.99680981 NA -0.83796981 NA 1.2742644 NA 0.67469277 NA
4 0.09940946 NA -0.89804952 NA 0.3419173 NA -0.95347049 NA
5 0.28270734 NA -0.57175554 NA -0.4889045 NA -0.11473839 NA
Run Code Online (Sandbox Code Playgroud)
你会怎么做?
我想要执行此操作的数据帧有数百列,所以很明显我不想输出每一列并像这样天真地添加它们:
dat$A1 <- NA
dat$B1 <- NA
dat$C1 <- NA
dat$D1 <- NA
dat <- dat[, c("A", "A1", "B", "B1", "C", "C1", "D", "D1")]
Run Code Online (Sandbox Code Playgroud)
感谢您提前帮助!
你可以试试
res <- data.frame(dat, dat*NA)[order(rep(names(dat),2))]
res
# A A.1 B B.1 C C.1 D D.1
#1 1.15660588 NA 0.78350197 NA -0.2098506 NA 2.07495662 NA
#2 0.60107853 NA 0.03517539 NA -0.4119263 NA -0.08155673 NA
#3 0.99680981 NA -0.83796981 NA 1.2742644 NA 0.67469277 NA
#4 0.09940946 NA -0.89804952 NA 0.3419173 NA -0.95347049 NA
#5 0.28270734 NA -0.57175554 NA -0.4889045 NA -0.11473839 NA
Run Code Online (Sandbox Code Playgroud)
注意:我将离开.列名称,因为删除它是一项微不足道的任务.
或者另一个选择是
dat[paste0(names(dat),1)] <- NA
dat[order(names(dat))]
Run Code Online (Sandbox Code Playgroud)
你可以试试这个
df <- cbind(dat, dat)
df <- df[, sort(names(df))]
df[, seq(2, 8,by=2)] <- NA
names(df) <- sub("\\.", "", names(df))
Run Code Online (Sandbox Code Playgroud)