将列与数据框中的其他列匹配,并添加匹配值的某些列

时间:2017-03-03 11:19:49

标签: r match

我尝试过搜索但找不到的东西。我找到了类似的线程,但他们仍然得不到我想要的东西。我知道应该有一个简单的方法来做到这一点,而无需编写循环函数。在这里

我有两个数据框df1和df2

df1 <- data.frame(ID = c("a", "b", "c", "d", "e", "f"), y = 1:6 )
df2 <- data.frame(x = c("a", "c", "g", "f"), f=c("M","T","T","M"), obj=c("F70", "F60", "F71", "F82"))
df2$f <- as.factor(df2$f)

现在我想将df1和df2“ID”和“x”列相互匹配。但是我想在df1数据框中添加新列,以匹配df2中的“ID”和“x”。 df1的最终输出应该如下所示

  ID y obj f1 f2
   a 1 F70 M  NA
   b 2 NA  NA NA
   c 3 F60 NA T
   d 4 NA  NA NA
   e 5 NA  NA NA
   f 6 F82 M  NA

2 个答案:

答案 0 :(得分:2)

我们可以在加入两个数据集并tidyverse'f'列后使用spread执行此操作

library(tidyverse)
left_join(df1, df2, by = c(ID = "x")) %>% 
               group_by(f) %>% 
               spread(f, f) %>%
               select(-6) %>%
               rename(f1 = M, f2 = T)
# A tibble: 6 × 5
#    ID     y    obj     f1     f2
#* <chr> <int> <fctr> <fctr> <fctr>
#1     a     1    F70      M     NA
#2     b     2     NA     NA     NA
#3     c     3    F60     NA      T
#4     d     4     NA     NA     NA
#5     e     5     NA     NA     NA
#6     f     6    F82      M     NA

使用data.table

的类似方法
library(data.table)
dcast(setDT(df2)[df1, on = .(x = ID)], x+obj + y ~ f, value.var = 'f')[, -6, with = FALSE]

答案 1 :(得分:1)

这是一个基础R流程。

# combine the data.frames
dfNew <- merge(df1, df2, by.x="ID", by.y="x", all.x=TRUE)

# add f1 and f2 variables
dfNew[c("f1", "f2")] <- lapply(c("M", "T"),
                               function(i) factor(ifelse(as.character(dfNew$f) == i, i, NA)))

# remove original factor variable
dfNew <- dfNew[-3]
  ID y  obj   f1   f2
1  a 1  F70    M <NA>
2  b 2 <NA> <NA> <NA>
3  c 3  F60 <NA>    T
4  d 4 <NA> <NA> <NA>
5  e 5 <NA> <NA> <NA>
6  f 6  F82    M <NA>