根据条件将值分配给矩阵

时间:2015-09-08 09:28:31

标签: r

我想创建一个包含3列的矩阵,如果条件满足,则需要多行指定1或0。

我有3个变量存储的数据

 df1 <- data.frame(names=c("A","B","C","D","E","F"))
 df2 <- data.frame(names=c("A","B","C","F"))
 df3 <- data.frame(names=c("E","F","H"))

输出

     df1  df2 df3
  A  1    1   0
  B  1    1   0 
  C  1    1   0
  D  1    0   0
  E  1    1   1
  F  1    0   1
  H  0    0   1

在第一行中,如果数据集中存在A,那么我将在每列下分配1,如果数据集中不存在A,则为0

这是我试过的

 DF <- rbind(df1,df2,df3)
 for (i in DF) { 
     for (j in 1:length(df1$names)) {
              if(i == df1$names[j]){
                    A3 <-data.frame(paste0("",i),paste0(1),paste0(0),paste0(0))
                    names(A3) <- NULL 
              }
              else{
                    A3 <-data.frame(paste0("",i),paste0(0),paste0(0),paste0(0))

              }
  }
}

我只为df1编写了这段代码,但它非常慢,因为我的orignal数据集中有超过1500行。最快的方法是什么?

3 个答案:

答案 0 :(得分:3)

为每个数据框添加分组变量:

df1 <- data.frame(names=c("A","B","C","D","E","F"),group="df1")
df2 <- data.frame(names=c("A","B","C","F"),group="df2")
df3 <- data.frame(names=c("E","F","H"),group="df3")
DF <- rbind(df1,df2,df3)

然后这样做:

   res <- table(DF)

> res
     group
names df1 df2 df3
    A   1   1   0
    B   1   1   0
    C   1   1   0
    D   1   0   0
    E   1   0   1
    F   1   1   1
    H   0   0   1

或者如果你想要一个数据帧:

library(reshape2)
dcast(names~group, data=DF,fun.aggregate = length)

答案 1 :(得分:1)

for %%a in (%installPrograms:,= %) do echo %%a Output: CCleaner Adobe Reader Cute PDF Writer 包的idcol中使用rbindlist参数时,无需单独为每个数据框创建分组列:

data.table

给出:

library(data.table) # I used v1.9.5 for this
DT <- rbindlist(list(df1, df2, df3), idcol="id")
dcast(DT[, .N , by=.(id,names)], names ~ id, fill=0)

答案 2 :(得分:0)

%in%运算符允许您检查字符串向量中是否存在字符串。它也是矢量化的,因此它的工作非常快:

x=c(LETTERS[c(1:6,8)])
df=data.frame(x=x,df1=as.numeric(x %in% df1$names),
          df2=as.numeric(x %in% df2$names),
          df3=as.numeric(x %in% df3$names))
df

如果速度至关重要,{data.table}包会使用%chin%运算符提高速度:

library(data.table)
x=c(LETTERS[c(1:6,8)])
dt=data.table(x=x,df1=as.numeric(x %chin% as.character(df1$names)),
          df2=as.numeric(x %chin% as.character(df2$names)),
          df3=as.numeric(x %chin% as.character(df3$names)))
dt