2017-02-15 1 views
0

Моих данных выглядят как этотпререкание данных: перекроить dataframe так, что несколько значений в ячейках становятся отдельными строками

enter image description here

X   Y Z A   B   C 
Qualify  10 35 us01 us03,ud05 um90,ug09 
Identify 20 23 us02 us06, us01 us91,us93,us95 

Но данные должны быть изменены для отображения, как показано ниже. Таким образом, данные внутри ячеек становятся рядами. Но некоторые ячейки имеют сингулярные значения, а некоторые имеют несколько разделенных запятой. Поэтому динамически они должны меняться и помещаться в новую строку с дублированием одних и тех же данных из других столбцов.

enter image description here

Identifier Role X  Y Z 
us01   A Qualify 10 35 
us03   B Qualify 10 35 
us05   B Qualify 10 35 
um90   C Qualify 10 35 
ug09   C Qualify 10 35 

Я попытался cSplit, но это не сработало, и на самом деле еще хуже.

+0

«pivotting/unpivotting» можно было бы сделать с помощью '' melt' и cast' (для хорошей производительности при использовании больших таблиц данных с помощью 'data.table' пакета, которые обеспечивают хорошую реализацию этих функций) –

ответ

0

См замечание @alistaire ниже для лучшего решения

с помощью ли эта работа tidyr/dplyr где ДФ идентификатор ваш кадр данных:

df %>% separate(B, into=c("B1","B2")) %>% 
     separate(C, into=c("C1","C2","C3")) %>% 
     gather(Role,Id,A:C3) 

дает это;

  X  Y  Z Role Id 
     <chr> <int> <int> <chr> <chr> 
1 Qualify 10 35  A us01 
2 Identify 20 23  A us02 
3 Qualify 10 35 B1 us03 
4 Identify 20 23 B1 us06 
5 Qualify 10 35 B2 ud05 
6 Identify 20 23 B2 us01 
7 Qualify 10 35 C1 um90 
8 Identify 20 23 C1 us91 
9 Qualify 10 35 C2 ug09 
10 Identify 20 23 C2 us93 
11 Qualify 10 35 C3 <NA> 
12 Identify 20 23 C3 us95 
+1

Не если количество значений в столбцах A, B и C изменяется по длине или совпадает с количеством вопросов в вопросе. – krish

+0

Большое спасибо! Но что, если мы не знаем, сколько отдельных значений существует под B или C? Или есть больше значений чисел, чем считалось ранее в этих столбцах. И вместо B1/B2 или C1/C2/C3; я не могу получить то же значение во всем. Таким образом, значение B как ячейка строки в новом фрейме данных для всех значений столбца B в исходных данных. – Rev

+0

Значения под A, B и C изменяются по длине. – Rev

0

Очень наивный способ получить требуемый результат. Наверное, это не лучшее решение, но я думаю, что он получает то, что вы хотите.

Вызов набора данных data.

data <- tidyr::gather(data, "Role", "Identifier", 4:6) 
data2 <- strsplit(data$Identifier, split = ",") 
data2 <- data.frame(X = rep(data$X, sapply(data2, length)), 
        Y = rep(data$Y, sapply(data2, length)), 
        Z = rep(data$Z, sapply(data2, length)), 
        Role = rep(data$Role, sapply(data2, length)), 
        Identifier = unlist(data2)) 
+0

Получил ошибку, когда я попробовал этот метод. Может быть, я делаю что-то неправильно. Но вышеупомянутое решение сработало. Благодаря!!! – Rev

+0

Я только что проверил код снова с тем же набором данных. Кажется, он работает нормально. Какая у вас ошибка? И да, решение в комментариях - это лучший способ решить эту проблему. – krish

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