Объединить два кадра данных, но означать столбцы, которые существуют в обоих - PullRequest
0 голосов
/ 20 декабря 2018

Скажем, у меня есть два data.frames,

df = data.frame(gene = c("KRAS", "FOS"), A6 = c(20, 50), A7 = c(90, 80))
df2 = data.frame(gene = c("KRAS", "FOS"), A6 = c(20, 250) )

Здесь A6 повторяется, и когда я пытаюсь объединить эти два кадра данных, используя merge(df, df2, by = "gene")), и он создает новые столбцы с A6.x и A6.y.

Есть ли способ слить его так, чтобы вместо него использовалось среднее значение дублирующихся столбцов?Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Поскольку требуемый merge в этом примере не добавляет новые столбцы в df, вы можете использовать обновление data.table join

library(data.table)
setDT(df)
setDT(df2)

df[df2, on = .(gene), A6 := (A6 + i.A6)/2]

df
#    gene  A6 A7
# 1: KRAS  20 90
# 2:  FOS 150 80

Это изменит df.Если вам нужен новый фрейм данных, вы можете использовать copy

copy(df)[df2, on = .(gene), A6 := (A6 + i.A6)/2]

Для нескольких общих столбцов

no.avg <- 'gene'
common <- intersect(names(df), names(df2))
common <- setdiff(common, no.avg)

df[df2, on = .(gene), 
   (common) := (get(common) + get(paste0('i.', common)))/2]
0 голосов
/ 20 декабря 2018

После merge ing split данных по именам числовых столбцов (подстрока) и получения rowMeans

cbind(out[1], sapply(split.default(out[-1], 
          sub("\\..*", "", names(out)[-1])), rowMeans))
#  gene  A6 A7
#1  FOS 150 80
#2 KRAS  20 90

data

out <- merge (df, df2, by="gene")
...