合并两个数据框,但意味着两者都存在的列
Merge two dataframes but mean columns that exists in both
假设我有两个 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
创建新的列。
有没有办法让它合并,从而取重复列的平均值?谢谢!
在 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
数据
out <- merge (df, df2, by="gene")
由于此示例中所需的 merge
没有向 df
添加任何新列,您可以使用 data.table 更新连接
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]
假设我有两个 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
创建新的列。
有没有办法让它合并,从而取重复列的平均值?谢谢!
在 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
数据
out <- merge (df, df2, by="gene")
由于此示例中所需的 merge
没有向 df
添加任何新列,您可以使用 data.table 更新连接
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]