2015-05-11 3 views
1

У меня есть проблема предварительной обработки данных, которая очень распространена в моей работе. Обычно у меня есть два файла, которые я, в конце концов, хочу выполнить большую операцию сопоставления. Обычно это двухэтапный процесс, когда первый шаг включает в себя создание «очищенного» фрейма данных первого файла, а второй шаг - сделать совпадение (vlookup) со вторым файлом более крупного блока данных. Мне нужна помощь с первым шагом в этом вопросе. Я создал простой пример ниже для работы. Мой упрощена dataframe:Сплит dataframe на отфильтрованном символе и создание нескольких новых столбцов

c1 <- 1:15 
c2 <- c("Valuelabels", "V1", "1", "2", "Valuelabels", "V2", "1", "2", "3", "Valuelabels", "V3", "1", "2", "3", "4") 
c3 <- c("", "", "Male", "Female", "", "", "Married", "Single", "Other", "", "", "SingleWithChildren", "SingleWithoutChildren","MarriedWithChildren", "PartneredWithChildren") 

df <- data.frame(row.names =c1,c2,c3) 
df 

      c2     c3 
1 Valuelabels      
2   V1      
3   1     Male 
4   2    Female 
5 Valuelabels      
6   V2      
7   1    Married 
8   2    Single 
9   3     Other 
10 Valuelabels      
11   V3      
12   1 SingleWithChildren 
13   2 SingleWithoutChildren 
14   3 MarriedWithChildren 
15   4 PartneredWithChildren 

Теперь я хотел бы разделить dataframe на строку «Valuelabel» в первом столбце и в конечном итоге с новым dataframe глядя, как это:

V1 V1_match V2 V2_match V3    V3_match 
1: 1  Male 1 Married 1 SingleWithChildren 
2: 2 Female 2 Single 2 SingleWithoutChildren 
3: NA   3 Other 3 MarriedWithChildren 
4: NA   NA   4 PartneredWithChildren 

I в конце концов хотел бы создать фрейм данных с V1 как имена столбцов и соответствующие значения под ними как новый столбец рядом с именем в моем примере V1_match ... и так далее для V2-V3.

Этот блок данных завершит мой первый шаг, прежде чем сопоставлять его с более крупным информационным блоком.

Очень благодарен за помощь.

ответ

2

Вот возможный data.table решение

library(data.table) # v 1.9.5 
setDT(df)[, indx := c2[2L], by = cumsum(c2 == "Valuelabels")] 
df2 <- df[!grepl("\\D", c2)][, indx2 := seq_len(.N), by = indx] 
dcast(df2, indx2 ~ indx, value.var = c("c2", "c3")) 
# indx2 V1_c2 V2_c2 V3_c2 V1_c3 V2_c3     V3_c3 
# 1:  1  1  1  1 Male Married SingleWithChildren 
# 2:  2  2  2  2 Female Single SingleWithoutChildren 
# 3:  3 NA  3  3  NA Other MarriedWithChildren 
# 4:  4 NA NA  4  NA  NA PartneredWithChildren 

you''ll необходимо установить data.table v> 1.9.5 для того, чтобы запустить это с помощью

library(devtools) 
install_github("Rdatatable/data.table", build_vignettes = FALSE) 
+0

Я был немного неясен, но я также хотел бы сохранить t он столбцы для (V1, V2, V3) в моем примере, иногда в моих данных они являются строками, а иногда они являются числами, но все имеют уникальное значение. – jonas

+0

Ок, см. мое редактирование. Я надеюсь, что это помогает. После этого вы можете изменить порядок столбцов. –

+1

Отлично, спасибо. Действительно помог мне. – jonas

1

Альтернативный подход базу R:

lst = lapply(split(df,cumsum(df$c2=='Valuelabels')), tail, -2) 
Reduce(function(u,v) merge(u,v,by='c2',all=T), lst) 
# c2 c3.x c3.y     c3 
#1 1 Male Married SingleWithChildren 
#2 2 Female Single SingleWithoutChildren 
#3 3 <NA> Other MarriedWithChildren 
#4 4 <NA> <NA> PartneredWithChildren 
Смежные вопросы