【问题标题】:Create new list in R based on matching values from two data.frames根据来自两个 data.frames 的匹配值在 R 中创建新列表
【发布时间】:2022-01-11 18:47:01
【问题描述】:

我有一个看起来像这样的数据框:

df<-data.frame(x=c('x1','x2','x3','x4','x5'),y=c(1,2,3,4,5))
df2<-data.frame(x=c('x3','x5'),y=c(3,5))

df3<-merge(df,df2,by="x")

如何根据df 中的x 值是否与df2 中的x 值匹配来创建0 和1 的列表?例如,新的数据框如下所示:

newdf&lt;-data.frame(x=c('x1','x2','x3','x4','x5'),y=c(1,2,3,4,5),match=c(0,0,1,0,1)

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    使用data.table(匹配xy):

    library(data.table)
    setDT(df)
    df[, match := 0L]
    df[df2, on = .(x, y), match := 1L]
    #     x y match
    # 1: x1 1     0
    # 2: x2 2     0
    # 3: x3 3     1
    # 4: x4 4     0
    # 5: x5 5     1
    

    【讨论】:

    • 谢谢!我有一个类似的问题,现在 df2 是数据框列表。有没有办法将df 匹配到列表中的每个数据框并为每个匹配项创建一个新列?
    • 你可以使用 for 循环。
    【解决方案2】:

    base 解决方案可重新创建您的 newdf

    newdf <- df
    newdf$match <- ifelse(df$x %in% df2$x, 1, 0)
    

    或者,使用tidyverse 语法:

    library(tidyverse)
    
    df %>%
      mutate(match = ifelse(x %in% df2$x, 1, 0))
    

    【讨论】:

    • 谢谢!我有一个类似的问题,现在 df2 是数据框列表。有没有办法将df 匹配到列表中的每个数据框并为每个匹配项创建一个新列?
    • 是的,这也可以做到——可能值得用一些可重复的样本数据提出一个单独的问题。基本思想(如果采用basetidyverse 方法)将在您的列表上运行lapply(),其中包含一个类似于上面的匿名函数,然后将行绑定在一起——类似于@987654330 @ 后跟 rbind() 或类似的东西。
    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 2017-05-08
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    相关资源
    最近更新 更多