Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 合并两个数据帧,但表示两个数据帧中存在的列_R_Dplyr_Plyr_Reshape2 - Fatal编程技术网

R 合并两个数据帧,但表示两个数据帧中存在的列

R 合并两个数据帧,但表示两个数据帧中存在的列,r,dplyr,plyr,reshape2,R,Dplyr,Plyr,Reshape2,假设我有两个数据帧 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的新列 有没有一种方法可以让它合并,从而取而代之的是重复的列的平均值?谢谢 在merg

假设我有两个数据帧

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
添加任何新列,因此可以使用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]

no.avg不错!请问,如果有许多列被复制,您如何处理?这是什么魔法?它工作,但不理解它。当我尝试合并>2个复制时,它甚至可以工作。谢谢。@Ahdee关键是根据列名的通用性将数据集拆分为
数据的
列表。在这里,我们删除了
.x
.y
部分和
子部分,因此列名在拆分时是相同的。然后,它只是在
列表中循环(使用
sapply
)并获得行平均值
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]