2015-07-09 1 views
3

Скажем, у вас есть dataframe из четырех колонок:Вставьте пустой столбец между каждым столбце dataframe в R

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

И вы хотите, чтобы вставить пустой столбец между каждой из колонок в dataframe, так что выход:

  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 

Как вы это сделаете?

dataframe Я хотел бы сделать эту операцию, чтобы сотни колонок и так очевидно, что я не хочу, чтобы напечатать каждую колонку и добавить их наивности, как это:

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

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

Спасибо вам помочь заранее!

ответ

2

вы можете попробовать это

df <- cbind(dat, dat) 
df <- df[, sort(names(df))] 
df[, seq(2, 8,by=2)] <- NA 
names(df) <- sub("\\.", "", names(df)) 
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) 
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))] 
Смежные вопросы