2016-08-16 3 views
0

Я начинаю с R, и я хочу объединить два набора данных вместе на основе столбца ID. Если идентификатор ID набора данных существует в наборе данных 1, то я хочу, чтобы данные для этой конкретной строки из набора данных 2 были добавлены в строку в наборе данных 1.Объединить данные в r на основе условий и создать новый столбец

Во-вторых, если есть совпадение, я хочу поставить «1» в новом столбце под названием match для этой конкретной строки/соответствия и «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» в воспроизводимом примере не соответствует. Чтобы создать двоичный столбец, просто используйте '% in%' с 'as.integer' – akrun

+0

данные вашего примера с ожидаемым выводом, а воспроизводимый код не одинаковый. У вас нет идентификатора '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», и вы также должны создать переменную 'match' согласно OP – Sotos

+1

Большое спасибо! Казалось, это сработало для меня. – Veraaa

0

Если вы можете предоставить соответствующий результат для предоставленных данных, я могу обновить его, если необходимо. Однако вы можете установить идентификатор на основе флага в df2, который соответствует в df1, следующими шагами.

обновление: Похоже, вы хотите отобразить значение 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

Смежные вопросы