【问题标题】:Merge data in r based on conditions and creating a new column根据条件合并r中的数据并创建一个新列
【发布时间】:2016-08-16 12:55:04
【问题描述】:

我是 R 的初学者,我想根据 ID 列将两个数据集合并在一起。如果数据集 2 的 ID 号存在于数据集 1 中,那么我希望将数据集 2 中此特定行的数据添加到数据集 1 中的行中。

其次,如果有匹配项,我想在一个名为 match 的新列中为该特定行/匹配项添加一个“1”,如果没有匹配项,则为“0”。

例子:

Dataset 1: 

Id     category 
123    3
124    1
125    2

Dataset 2: 

Id     score category 
123    0.24    3
124    0.83    1 
126    0.92    2  

添加列的最终示例:

Id      score category  match
123    0.24    3         1 
124    0.83    1         1
125    NA      1         0
126    0.92    2         1

到目前为止,我已经尝试过这个(以及其他一些组合),但这并没有给我带来好的结果:

data <- merge(df1, df2, by ="ID" , all.x = TRUE)

非常感谢任何帮助!

可重现的代码:

df1 <- data.frame(ID=c("123","124","125"), category=c(3,1,2)
df2 <- data.frame(ID=c("123","124","126"), score=("0.24","0.83","0.92"), category=c("3","1","2")

【问题讨论】:

  • 你有character NA吗?它不应该放在引号中。显示的输入数据与可重现示例中的“df2”不匹配。要创建二进制列,只需使用 %in%as.integer
  • 您的示例数据具有预期的输出和可重现的代码是不一样的。你没有 id 126
  • 感谢您的 cmets!很抱歉造成混乱,我在发布此内容时犯了一些错误!我已经在数据集 2 中编辑了 id 126。想法是数据集 1 中会有一些特定的 id 在数据集 2 中不存在(例如,数据集 2 中没有 id 125)。

标签: r merge


【解决方案1】:

你快到了。我稍微修改了你的例子。

df1 <- data.frame(ID = c(123, 124, 125),
                  category=c(3, 1, 2))
df1

df2 <- data.frame(ID = c(123, 124, NA),
                  score = c(0.24, 0.83, 0.35),
                  category = c(3, 1, 2))
df2

df2$match <- 1
df2

data <- merge(df1, df2, by = c("ID", "category") , all.x = TRUE)
data$match[is.na(data$match)] <- 0
data

【讨论】:

  • 这不起作用。它必须是 all = TRUE 并且您还应该根据 OP 创建 match 变量
【解决方案2】:

如果您可以为您提供的数据提供适当的结果,我可以在需要时对其进行更新。但是,您可以通过以下步骤在 df2 中标记与 df1 中匹配的基于 ID。

更新:看起来您只想显示 x 值而不是 y 值。通过调用all.x =T更新输出

data <- merge(df1, df2, by = c('ID', 'category') ,  all.x = T)
data$match <- ifelse(data$ID %in% df2$ID, 1, 0)

输出

    ID category score match
1 123        3  0.24     1
2 124        1  0.83     1
3 125        2  <NA>     0

数据

 df1 <- data.frame(ID=c("123","124","125"), category=c(3,1,2))
 df2 <- data.frame(ID=c("123","124","126"), score= c("0.24","0.83","0.92"),
               category=c(3,1,2))

【讨论】:

  • 应该是by = c('ID', 'category')
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2021-11-28
  • 2017-12-30
  • 2019-11-29
  • 2021-09-19
  • 1970-01-01
相关资源
最近更新 更多