2015-02-02 3 views
3

Я уже нашел другие версии одного и того же вопроса, но мне не удалось адаптировать ответы, предоставленные там для моей проблемы. Вот older link:разделение разделенных запятыми входов столбцов в строки

У этого объекта были данные, состоящие только из двух столбцов, и данный ответ обрабатывает это действительно красиво. Но как насчет более двух столбцов? Есть ли способ адаптировать связанный фрагмент кода?

Вот пример:

ve <- rbind("4,2","3","1,2,3","5","6","7") 
expl <- cbind(head(mtcars),ve) 

    row.names   mpg  cyl  disp hp  drat wt  qsec vs am gear carb ve 
1 Mazda RX4   21.0 6  160  110  3.90 2.620 16.46 0 1 4 4  4,2 
2 Mazda RX4 Wag  21.0 6  160  110  3.90 2.875 17.02 0 1 4 4  3 
3 Datsun 710   22.8 4  108  93  3.85 2.320 18.61 1 1 4 1  1,2,3 
4 Hornet 4 Drive  21.4 6  258  110  3.08 3.215 19.44 1 0 3 1  5 
5 Hornet Sportabout 18.7 8  360  175  3.15 3.440 17.02 0 0 3 2  6 
6 Valiant    18.1 6  225  105  2.76 3.460 20.22 1 0 3 1  7 

я должен был бы:

row.names   mpg  cyl  disp hp  drat wt  qsec vs am gear carb ve 
1 Mazda RX4   21.0 6  160  110  3.90 2.620 16.46 0 1 4 4  4 
2 Mazda RX4   21.0 6  160  110  3.90 2.620 16.46 0 1 4 4  2 
3 Mazda RX4 Wag  21.0 6  160  110  3.90 2.875 17.02 0 1 4 4  3 
4 Datsun 710   22.8 4  108  93  3.85 2.320 18.61 1 1 4 1  1 
5 Datsun 710   22.8 4  108  93  3.85 2.320 18.61 1 1 4 1  2 
6 Datsun 710   22.8 4  108  93  3.85 2.320 18.61 1 1 4 1  3 
7 Hornet 4 Drive  21.4 6  258  110  3.08 3.215 19.44 1 0 3 1  5 
8 Hornet Sportabout 18.7 8  360  175  3.15 3.440 17.02 0 0 3 2  6 
9 Valiant    18.1 6  225  105  2.76 3.460 20.22 1 0 3 1  7 

Спасибо!

+0

Итак, вы хотите вставить повторяющиеся строки? Это может стать беспорядочным позже. –

ответ

2

Вот попытка использования только базовый R (который также сохраняет строку names- таким образом, по крайней мере ...)

ve <- strsplit(ve, ",") 
Res <- expl[rep(seq_len(nrow(expl)), sapply(ve, length)), ] 
Res$ve <- unlist(ve) 
Res 
#     mpg cyl disp hp drat wt qsec vs am gear carb ve 
# Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 4 
# Mazda RX4.1  21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 2 
# Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 3 
# Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 1 
# Datsun 710.1  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 2 
# Datsun 710.2  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 3 
# Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 5 
# Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 6 
# Valiant   18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 7 

Или с помощью data.table, один вариант

library(data.table) 
setDT(expl)[, 
      strsplit(as.character(ve), ","), 
      c(names(expl)[-length(expl)]) 
      ] 

Другим вариантом будет

setkey(expl, ve)[setDT(expl)[, strsplit(as.character(ve), ","), ve]] 
+1

Я уже использовал fread from data.table в моем текущем проекте, поэтому я буду использовать это - очень приятно! – MineSweeper

4

Попробуйте unnest от tidyr package. В моем примере используется dplyr, но вы также можете выполнять базовые функции.

library(dplyr) 
library(tidyr) 

expl %>% 
    mutate(ve = strsplit(as.character(ve), ",")) %>% 
    unnest(ve) 
+0

никогда не использовал tidyr - подробнее об этом читайте! благодаря! – MineSweeper

1

Я бы порекомендовал cSplit из моего пакета «splitstackshape».

Поскольку ваш пример имеет rownames, я преобразовал ваши данные примера в data.table с аргументом keep.rownames = TRUE.

library(splitstackshape) 
cSplit(as.data.table(expl, keep.rownames = TRUE), "ve", ",", "long") 
#     rn mpg cyl disp hp drat wt qsec vs am gear carb ve 
# 1:   Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 4 
# 2:   Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 2 
# 3:  Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 3 
# 4:  Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 1 
# 5:  Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 2 
# 6:  Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 3 
# 7: Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 5 
# 8: Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 6 
# 9:   Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 7 
Смежные вопросы