2013-05-01 66 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 2013-05-01 21:06:42

+0

@eddi你的代码中的n是什么?运行sparseMatrix函数时出现错误。 – user2133354 2013-05-01 21:45:56

+0

你必须更具体 - 这段代码适用于我(假设你从那里的原始问题'dt') – eddi 2013-05-01 21:51:52

回答

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 2013-05-01 19:21:16

+0

这里是完全相同的解决方案,但在adply函数中实现 – 2013-05-01 20:09:39