【问题标题】:Matching columns with other columns in data frames and adding certain columns of matching values将列与数据框中的其他列匹配并添加某些匹配值列
【发布时间】:2017-03-03 11:19:49
【问题描述】:

我已尝试搜索某些内容,但找不到。我找到了类似的线程,但他们仍然没有得到我想要的。我知道应该有一种简单的方法来做到这一点,而无需编写循环函数。就这样吧

我有两个数据框 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

【问题讨论】:

  • 为什么T 在f2 列中? f1 和 f2 列代表什么?
  • 它们代表df2中的f列

标签: r match


【解决方案1】:

我们可以在加入两个数据集后使用tidyverse 和spread 'f' 列来做到这一点

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]

【讨论】:

    【解决方案2】:

    这是一个基本的 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>
    

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 2015-11-21
      相关资源
      最近更新 更多