R中的数据匹配

时间:2017-06-07 16:28:01

标签: r regex match

我有两个长度相同(1000)和宽度(200)的数据帧。在两个数据帧中,每行都是一个人。在一个数据帧中,每列是二进制项目分数(即0或1)。在另一个数据框中,每列都是项标签。这是它:

数据框1:

item1 item2 item3
0     1     1
1     0     0
1     1     1

Dataframe 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

谢谢!

2 个答案:

答案 0 :(得分:2)

我们可以melt将两个数据集{长}'格式',做一个left_join,然后再spread来广泛'删除' 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

base R选项是replace&#39; df2&#39;的相应列值。与NA在哪里&#39; df1&#39;值{0}使用Map,然后stack将数据设置为&#39; data.frame&#39;,transform&#39;值&#39;列到factor并获得table

的频率
un1 <- unique(unlist(df2))
table(transform(stack(Map(function(x,y) replace(y, !x, NA), 
  df1, df2))[2:1], values = factor(values, levels = un1)))

答案 1 :(得分:2)

基地R的尝试使用mapplymatch,如下所示。下面的代码使用match返回带有NA的向量,其中dat2列没有任何变量,dat2的相应值在dat2中匹配。对于所需的输出结构,必须转换dat1 data.frame(data.frame(t(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

返回带有命名变量的data.frame,将其包含在tdata.framesetNames中。

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

下面的数据将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
))