在R中的数据框的每一列之间插入一个空列

时间:2015-07-09 11:37:58

标签: r dataframe

假设您有一个包含四列的数据框:

dat <- data.frame(A = rnorm(5), B = rnorm(5), C = rnorm(5), D = rnorm(5))

并且您希望在数据框的每个列之间插入一个空列,以便输出为:

           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

你会怎么做?

我想要执行此操作的数据帧有数百列,所以很明显我不想输出每一列并像这样天真地添加它们:

dat$A1 <- NA
dat$B1 <- NA
dat$C1 <- NA
dat$D1 <- NA

dat <- dat[, c("A", "A1", "B", "B1", "C", "C1", "D", "D1")]

先谢谢你的帮助!

3 个答案:

答案 0 :(得分:7)

你可以尝试

 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

注意:我将.留在列名中,因为删除它是一项微不足道的任务。

或另一种选择是

dat[paste0(names(dat),1)] <- NA
dat[order(names(dat))]

答案 1 :(得分:2)

你可以试试这个

df <- cbind(dat, dat)
df <- df[, sort(names(df))]
df[, seq(2, 8,by=2)] <- NA
names(df) <- sub("\\.", "", names(df))

答案 2 :(得分:0)

# create new data frame with twice the number of columns
bigdat <- data.frame(matrix(ncol = dim(dat)[2]*2, nrow = dim(dat)[1]))

# set sequence of target column indices
inds <- seq(1,dim(bigdat)[2],by=2)

# insert values
bigdat[,inds] <- dat

# set column names
colnames(bigdat)[inds] <- colnames(dat)