String 将字符串转换为R中的多个二进制列
我有一个数据框,看起来像:String 将字符串转换为R中的多个二进制列,string,r,binary,dataframe,String,R,Binary,Dataframe,我有一个数据框,看起来像: 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 因此,字符串中的每个唯一名称都应该成为一个新列的标题,该列描述在什么日期看到/没有看到它 libra
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
因此,字符串中的每个唯一名称都应该成为一个新列的标题,该列描述在什么日期看到/没有看到它
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
以下是一个暴力解决方案:
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
谢谢你的建议。看起来第二个for循环非常慢(我有64000行)。有什么建议可以让它更快吗?这里的解决方案与以前完全相同,但是在adply函数中实现了。谢谢你的建议。看起来第二个for循环非常慢(我有64000行)。有什么建议可以让它更快吗?这里的解决方案与以前完全相同,但在adply函数中实现。请看这个问题:@eddi代码中的n是什么?我在运行sparseMatrix函数时出错。您必须更具体一点-该代码对我有效(假设您从原始问题中获取
dt
)@eddi以“rows=…”开头的行中应该有什么它是data.table
中的一列,名为tmp
,在前面的表达式中构造。你真的应该从OP创建dt
,然后逐行运行代码。看到这个问题:@eddi你的代码中的n是什么?我在运行sparseMatrix函数时出错。您必须更具体一点-该代码对我有效(假设您从原始问题中获取dt
)@eddi以“rows=…”开头的行中应该有什么它是data.table
中的一列,名为tmp
,在前面的表达式中构造。您应该从OP创建dt
,然后逐行运行代码。