df1 <- data.frame(id=c(1,2,3,4,5,6),val1=c(1,2,3,NA,NA,6))
df2 <- data.frame(id=c(3,4,7,6,8) , val1=c(1,2,3,4,5))
Теперь нужно объединить значения val1 из df1 и df2 как средние значения, которые будут df1$val1
. Например:
df1$val1 <- mean(df1$val1,df2$val2, na.rm=TRUE) & match(by=id)
df1$val1
должен быть следующим
val1
1
2
2((3+1)/2)
4(4+NA/2)
NA
6
Мы могли бы попробовать
library(data.table)
rbindlist(list(df1, df2))[, .(val1 = mean(val1, na.rm = TRUE)), id][id %in% df1$id]
Или другой вариант
setDT(df1)[df2, val1 := rowMeans(cbind(val1, i.val1), na.rm = TRUE), on = .(id)]
Или как @Frank упомянул в комментариях
setDT(df1); setDT(df2)
df1[, v := df2[df1, on=.(id), mean(c(x.val1, i.val1),
na.rm=TRUE), by=.EACHI]$V1]
@PoGibas Извините, забыл ответить. Это тоже возможно, но я подумал использовать его, чтобы вернуть data.table
, иначе придется сделать setDT
до rbind
.
Мое решение с использованием приборки.
library(dplyr)
df1 <- data.frame(id=c(1,2,3,4,5,6),val1=c(1,2,3,NA,NA,6))
df2 <- data.frame(id=c(3,4,7,6,8) , val1=c(1,2,3,4,5))
df1 %>% left_join(df2, by = "id") %>% select(2:3) %>%
transmute(val1=rowMeans(., na.rm=T))
Просто любопытно - почему вы используете
rbindlist(list(...))
вместоrbind
? Получитьdata.table
?