R 根据条件为矩阵赋值
如果条件满足,我想创建一个包含3列和多行的矩阵,并将其赋值为1或0 我将数据存储在3个变量中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
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。我的数据中没有重复项