2013-05-01 2 views
1

У меня есть кадр данных, который выглядит как:Преобразование строк в нескольких бинарных столбцов в R

Date   Names 
1/1/2000  A|B 
2/3/2003  A|C|D 
2/4/2004  B|C|E 

Мне нужно, чтобы преобразовать его в:

Date   A B C D E 
1/1/2000  1 1 0 0 0 
2/3/2003  1 0 1 1 0 
2/4/2004  0 1 1 0 1 

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

+0

см. Этот вопрос: http://stackoverflow.com/questions/15905806/improve-text-processing-speed-using-r-and-data-table/16179023#16179023 – eddi

+0

@eddi Что такое n в коде? У меня возникла ошибка при запуске функции sparseMatrix. – user2133354

+0

вы должны быть более конкретными - этот код работает для меня (учитывая, что вы берете 'dt' из исходного вопроса там) – eddi

ответ

1

Вот скотина решение сила:

library(plyr) 

fun.2 = function (x) { 
     x[which(!is.na(match(names(x),strsplit(as.character(x[[2]]),'')[[1 ]][seq(1,length(strsplit(as.character(x[[2]]),'')[[1]]),by=2)])))] = 1 
     return(x) 
     } 
myfunction = function (df) { 
    df1 = cbind(df,A=rep(0,nrow(df)),B=rep(0,nrow(df)),C=rep(0,nrow(df)),D=rep(0,nrow(df)),E=rep(0,nrow(df))) 
    df2 = adply (df1,1,fun.2) 
    return(df2) 
} 

# you can run 

myfunction (df) 

     Date Names A B C D E 
1 1/1/2000 A|B 1 1 0 0 0 
2 2/3/2003 A|C|D 1 0 1 1 0 
3 2/4/2004 B|C|E 0 1 1 0 1 
+0

Спасибо за предложение. Похоже, что вторая для цикла очень медленная (и у меня 64000 строк). Любые предложения, как сделать это быстрее? – user2133354

+0

Здесь точно такое же решение, как раньше, но реализовано в виде функции adply –

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