Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 将字符串转换为R中的多个二进制列_String_R_Binary_Dataframe - Fatal编程技术网

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
,然后逐行运行代码。