Подтвердить что ты не робот

Объедините неравные данные и замените отсутствующие строки на 0

У меня есть два data.frames, один с только символами, а другой с символами и значениями.

df1 = data.frame(x=c('a', 'b', 'c', 'd', 'e'))
df2 = data.frame(x=c('a', 'b', 'c'),y = c(0,1,0))
merge(df1, df2)
  x y
1 a 0
2 b 1
3 c 0 

Я хочу объединить df1 и df2. Символы a, b и c сливаются хорошо, а также имеют 0, 1, 0, но d и e ничего не имеют. Я хочу, чтобы d и e также находились в таблице слияния с условием 0 0. Таким образом, для каждой отсутствующей строки в df2 data.frame значение 0 должно быть помещено в таблицу df1, например:

  x y
1 a 0
2 b 1
3 c 0
4 d 0
5 e 0
4b9b3361

Ответ 1

Взгляните на страницу справки для слияния. Параметр all позволяет указать различные типы слияний. Здесь мы хотим установить all = TRUE. Это приведет к возврату слияния NA для значений, которые не соответствуют, которые мы можем обновить до 0 с помощью is.na():

zz <- merge(df1, df2, all = TRUE)
zz[is.na(zz)] <- 0

> zz
  x y
1 a 0
2 b 1
3 c 0
4 d 0
5 e 0

Ответ 2

Или, как альтернатива @Chase-коду, будучи недавним поклонником plyr с фоном в базах данных:

require(plyr)
zz<-join(df1, df2, type="left")
zz[is.na(zz)] <- 0

Ответ 3

Другая альтернатива с таблицей данных.

ПРИМЕР ДАННЫХ

dt1 <- data.table(df1)
dt2 <- data.table(df2)
setkey(dt1,x)
setkey(dt2,x)

КОД

dt2[dt1,list(y=ifelse(is.na(y),0,y))]

Ответ 4

Я использовал ответ, полученный Чейзом (ответил 11 мая 2011 года в 14:21), но я добавил немного кода, чтобы применить это решение к моей конкретной проблеме.

У меня был фрейм ставок (пользователь, загрузка) и кадр итогов (пользователь, загрузка), которые должны быть объединены пользователем, и я хотел включить каждую скорость, даже если не было соответствующей суммы. Однако не может быть недостающих итогов, и в этом случае выбор строк для замены NA на ноль потерпит неудачу.

Первая строка кода выполняет слияние. Следующие две строки изменяют имена столбцов в объединенном фрейме. Оператор if заменяет NA на ноль, но только если есть строки с NA.

# merge rates and totals, replacing absent totals by zero
graphdata <- merge(rates, totals, by=c("user"),all.x=T)
colnames(graphdata)[colnames(graphdata)=="download.x"] = "download.rate"
colnames(graphdata)[colnames(graphdata)=="download.y"] = "download.total"
if(any(is.na(graphdata$download.total))) {
    graphdata[is.na(graphdata$download.total),]$download.total <- 0
}