2016-08-11 5 views
-4

Как добавить столбец данных, например, названный «Синий» после каждого столбца, который содержит слово «значение»? Я предпочитаю использовать data.table, но не может найти решение БлагодаряВставка столбца после определенного столбца

Blue BCS_code1 BCS_code2 BCS_value Wt_code1 Wt_code2 Wt_value 
1/05  125   255   4   258  154  6 
6/06  256   525   8   112  254  6 

И мне нужно

Blue BCS_code1 BCS_code2 BCS_value Blue Wt_code1 Wt_code2 Wt_value Blue 
    1/05  125   255   4  1/05  258  154  6  1/05 
    6/06  256   525   8  6/06  112  254  6  6/06 

я понимаю, что будет Mutiple колонны под названием «Blue», но это хорошо для того, что мне нужно

+4

Просьба показать небольшой воспроизводимый пример и ожидаемый результат. Лучше не вставлять повторяющиеся имена столбцов, а также неясно, какими должны быть значения в «Синем». По сути, это нечеткое сообщение. – akrun

+0

Можете ли вы представить пример кода, пожалуйста? – ChrisRich

+0

Я не могу предоставить один извините – proctor

ответ

2

Подобный ответ @ shayaa, и в соответствии со стратегией в Wojciech Sobala's answer elsewhere:

w0  = which(names(DT) %like% "value") 
w  = w0 + seq_along(w0) 

cols  = character(length(DT) + length(w)) 
cols[w] = "Blue" 
cols[-w] = names(DT) 

DT[, cols, with=FALSE] 

Без data.table, используйте which(grepl("value", names(DT))) в первой строке и DT[cols] для последнего.


Код выше не добавляет столбцы исходной таблицы, как OP интересовалась. Это с повторяющимися именами очень неаккуратно для data.table, предположительно, по дизайну, так как это плохо идея.

+1

Thats done it! спасибо за вашу помощь вам обоим – proctor

2

Отказ от ответственности: Я не сторонник делать то, что вы хотите сделать здесь. Копирование данных таким образом является вычислительно интенсивным и, вероятно, не нужно.

Тем не менее, вот как вы это сделаете. Сначала создайте пустой фрейм данных того размера, который вы хотите.

dims <- dim(df) 
ind <- agrep("value",names(df)) 
new_dims <- c(dims[1], dims[2] +length(ind)) 
new_df <- data.frame(matrix(rep(NA, prod(new_dims)), nrow = dims[1])) 

Затем скопируйте данные в соответствующие индексы.

names(new_df)[ind + seq_along(ind)] <- "Blue" 
new_df[,ind + seq_along(ind)] <- df$Blue 
names(new_df)[setdiff(1:new_dims[2], ind + seq_along(ind))] <- names(df) 
new_df[,setdiff(1:new_dims[2], ind + seq_along(ind))] <- df 

new_df 
    Blue BCS_code1 BCS_code2 BCS_value Blue Wt_code1 Wt_code2 Wt_value Blue 
1 1/05  125  255   4 1/05  258  154  6 1/05 
2 6/06  256  525   8 6/06  112  254  6 6/06 

Вы можете прочитать первую главу R пекло, чтобы понять мириады проблем неэффективного растущих объектов.

Смежные вопросы