R 根据条件为矩阵赋值

R 根据条件为矩阵赋值,r,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")) 在第一行中,如果数据集中存在,则我将在每列下分配1,如果数据集中不存在,则分配0 这是我试过的 DF &l

如果条件满足,我想创建一个包含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"))
在第一行中,如果数据集中存在,则我将在每列下分配1,如果数据集中不存在,则分配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))

              }
  }
}

DF向每个数据帧添加分组变量:

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)
library(reshape2)
dcast(names~group, data=DF,fun.aggregate = length)

向每个数据帧添加分组变量:

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)
library(reshape2)
dcast(names~group, data=DF,fun.aggregate = length)

%在%运算符中,您可以检查字符串向量中是否存在字符串。它也是矢量化的,因此工作速度相当快:

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

%在%运算符中,您可以检查字符串向量中是否存在字符串。它也是矢量化的,因此工作速度相当快:

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

下面的代码比其他答案略显笼统。另外,我认为了解如何动态创建命令很有用。。。 我使用您准备的数据帧:

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") )

DF <- rbind( df1, df2, df3 )
nDF <- unique( DF ) #we don't want to duplicate tests.

df1下面的代码比其他答案略显笼统。另外,我认为了解如何动态创建命令很有用。。。
我使用您准备的数据帧:

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") )

DF <- rbind( df1, df2, df3 )
nDF <- unique( DF ) #we don't want to duplicate tests.

df1使用
data.table
包的
rbindlist
中的
idcol
参数时,无需分别为每个数据帧创建分组列:

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)

使用
data.table
包的
rbindlist
中的
idcol
参数时,无需分别为每个数据帧创建分组列:

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)

这适用于您提供的示例数据,我现在不知道您的数据中是否有相同字符串的多个实例?非常感谢Heroka。我的数据中没有重复项这适用于您给出的示例数据,我现在不知道您的数据中是否有相同字符串的多个实例?非常感谢Heroka。我的数据中没有重复项