首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并两种数据格式,但这两种数据中存在的列的平均值

合并两种数据格式,但这两种数据中存在的列的平均值
EN

Stack Overflow用户
提问于 2018-12-20 13:32:19
回答 2查看 73关注 0票数 2

假设我有两个data.frames,

代码语言:javascript
复制
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.xA6.y创建新的列。

是否有一种方法可以让它进行合并,而不是采用复制的列的平均值?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-20 13:35:01

merge执行split之后,通过数字列名(子字符串)获取数据并获取rowMeans

代码语言:javascript
复制
cbind(out[1], sapply(split.default(out[-1], 
          sub("\\..*", "", names(out)[-1])), rowMeans))
#  gene  A6 A7
#1  FOS 150 80
#2 KRAS  20 90

数据

代码语言:javascript
复制
out <- merge (df, df2, by="gene")
票数 8
EN

Stack Overflow用户

发布于 2018-12-20 13:57:09

由于本例中所需的merge不向df添加任何新列,所以可以使用data.table更新连接

代码语言:javascript
复制
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

代码语言:javascript
复制
copy(df)[df2, on = .(gene), A6 := (A6 + i.A6)/2]

对于多个公共列

代码语言:javascript
复制
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]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53869746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档