R中的数据匹配
我有两个长度(1000)和宽度(200)相同的数据帧。在两个数据帧中,每一行都是一个人。在一个数据帧中,每列都是一个二进制项目分数(即0或1)。在另一个数据框中,每列都是项标签。这是: 数据帧1:R中的数据匹配,r,regex,match,R,Regex,Match,我有两个长度(1000)和宽度(200)相同的数据帧。在两个数据帧中,每一行都是一个人。在一个数据帧中,每列都是一个二进制项目分数(即0或1)。在另一个数据框中,每列都是项标签。这是: 数据帧1: item1 item2 item3 0 1 1 1 0 0 1 1 1 数据帧2: item1 item2 item3 C2HSD WW11S3 EI22S WW11S3 2JDDS TT6SQ1 EI22S TT6SQ1 3
item1 item2 item3
0 1 1
1 0 0
1 1 1
数据帧2:
item1 item2 item3
C2HSD WW11S3 EI22S
WW11S3 2JDDS TT6SQ1
EI22S TT6SQ1 331ID
我想要的是这样一个组合和匹配的数据帧:
C2HSD WW11S3 EI22S 2JDDS TT6SQ1 331ID
0 1 1 NA NA NA
NA 1 NA 0 0 NA
NA NA 1 NA 1 1
谢谢大家! 我们可以
将这两个数据集融合为“长”格式,进行左连接,然后在删除“Var2”后将其扩展为“宽”格式
library(reshape2)
library(tidyverse)
d1 <- melt(as.matrix(df1))
d2 <- melt(as.matrix(df2))
left_join(d2, d1, by = c("Var1", "Var2")) %>%
select(-Var2) %>%
spread(value.x, value.y) %>%
select(-Var1)
# 2JDDS 331ID C2HSD EI22S TT6SQ WW11S
#1 NA NA 0 1 NA 1
#2 0 NA NA NA 0 1
#3 NA 1 NA 1 1 NA
在基本R中的尝试使用mapply
和match
,如下所示。下面的代码使用match
返回带有NAs的向量,其中dat2列没有任何变量,dat1的相应值在dat2中存在匹配。对于所需的输出结构,必须对dat1 data.frame进行转置(data.frame(t(dat1))
)
下面的数据将dat2作为字符向量而不是因子。这是此类操作的首选存储类型
数据
dat1 <-
structure(list(item1 = c(0L, 1L, 1L), item2 = c(1L, 0L, 1L),
item3 = c(1L, 0L, 1L)), .Names = c("item1", "item2", "item3"
), class = "data.frame", row.names = c(NA, -3L))
dat2 <-
structure(list(item1 = c("C2HSD", "WW11S3", "EI22S"), item2 = c("WW11S3",
"2JDDS", "TT6SQ1"), item3 = c("EI22S", "TT6SQ1", "331ID")), .Names = c("item1",
"item2", "item3"), class = "data.frame", row.names = c(NA, -3L
))
dat1
# get the vector of unique names in dat2
vars <- unique(unlist(dat2))
mapply(function(x, y, vars) x[match(vars, y)],
data.frame(t(dat1)), dat2, MoreArgs=list(vars=vars))
X1 X2 X3
[1,] 0 NA NA
[2,] 1 1 NA
[3,] 1 NA 1
[4,] NA 0 NA
[5,] NA 0 1
[6,] NA NA 1
setNames(data.frame(t(mapply(function(x, y, vars) x[match(vars, y)],
data.frame(t(dat1)), dat2, MoreArgs=list(vars=vars)))), vars)
C2HSD WW11S3 EI22S 2JDDS TT6SQ1 331ID
X1 0 1 1 NA NA NA
X2 NA 1 NA 0 0 NA
X3 NA NA 1 NA 1 1
dat1 <-
structure(list(item1 = c(0L, 1L, 1L), item2 = c(1L, 0L, 1L),
item3 = c(1L, 0L, 1L)), .Names = c("item1", "item2", "item3"
), class = "data.frame", row.names = c(NA, -3L))
dat2 <-
structure(list(item1 = c("C2HSD", "WW11S3", "EI22S"), item2 = c("WW11S3",
"2JDDS", "TT6SQ1"), item3 = c("EI22S", "TT6SQ1", "331ID")), .Names = c("item1",
"item2", "item3"), class = "data.frame", row.names = c(NA, -3L
))