2016-08-16 209 views
0

我是R的初学者,我想基于ID列将两个数据集合并在一起。如果数据集2的ID号存在于数据集1中,那么我希望将来自数据集2的该特定行的数据添加到数据集1的行中。根据条件合并r中的数据并创建新列

其次,如果有匹配,我想把新列中的“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") 
+0

更新输出你有一个'character' NA?它不应该放在引号中。显示的输入数据和可重现示例中的'df2'不匹配。要创建二进制列,只需在'as.integer'中使用'%in%' – akrun

+0

您的示例数据与预期的输出和可重复的代码不一样。你没有ID'126'? – user5249203

+1

[如何加入(合并)数据帧(内部,外部,左侧,右侧)?](http://stackoverflow.com/questions/1299871/how-to-join-merge-data-frames-inner -outer-left-right) –

回答

0

你几乎没有。我稍微修改了你的例子。

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 
+0

这不起作用。它需要是'all = TRUE',并且您还应该根据OP – Sotos

+1

创建'match'变量非常感谢!它似乎为我工作。 – Veraaa

0

如果您可以为您提供的数据提供适当的结果,我可以根据需要进行更新。但是,您可以通过以下步骤在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)) 
+0

它应该是'by = c('ID','category')' – Sotos

+0

谢谢@Sotos,正在努力解决:) – user5249203

相关问题