我想创建一个包含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行。最快的方法是什么?
答案 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