我正在寻找一种简单的方法来组合两个数据框,将较小的数据框插入较大的数据框中,如下所示:
x.1: x.2: 1.1 1.2 2.3 3.4 1.2 2.3 a.b w z d.e u b.c x a.b v d.e y
期望的结果:
x.f: 1.1 1.2 2.3 3.4 a.b w v z b.c x d.e y u
在cols之后合并很多问题,但是我想根据cols 和行的名称进行合并,但是没有得到它。名称中的点是修复方案。如果有人提出建议会很高兴,因为我尝试合并,加入等等都没有成功。我脑海中的一个解决方案是手动方式,循环遍历较小的框架,每次查找值并保存行/列,然后插入更大的框架。或重组我的数据帧。但必须有一个更简单的方法吗?
提前, 罗宾
以下是快速试用的代码:
i<-c("w", "", "y")
j<-c("", "x", "")
k<-c("","","")
l<-c("z","","")
x.1 <- data.frame(i,j,k,l, row.names=c("a.b","b.c","d.e"))
colnames(x.1)<-c("1.1","1.2","2.3","3.4")
m<-c("u", "")
n<-c("", "v")
x.2 <- data.frame(m,n, row.names=c("d.e","a.b"))
colnames(x.2)<-c("1.2","2.3")
答案 0 :(得分:3)
这是一种方法:
library(reshape2)
mx1 <- melt(cbind(id = rownames(x.1), x.1), id.vars="id")
mx2 <- melt(cbind(id = rownames(x.2), x.2), id.vars="id")
x12 <- rbind(mx1, mx2)
out <- dcast(x12[!x12$value == "", ], id ~ variable)
out[is.na(out)] <- ""
out
# id 1.1 1.2 2.3 3.4
# 1 a.b w v z
# 2 b.c x
# 3 d.e y u
首先将每个数据集变为“长”数据集(最简单的使用“reshape2”中的melt
),然后将其转换回“宽”数据集(使用dcast
,再次从“ reshape2" )。
上述步骤并非全部,但我已将它们包含在尽可能接近您所需的输出中,以便您决定保留/删除哪些步骤。
实际上,如果你问我,我会停在“x12”阶段。从长远来看,“长”数据可能更方便操作和使用(没有双关语)。
您可能还需要考虑“datamerge”包,它实际上包含两个功能:clean.factors()
和version.merge
。 clean.factors
函数将在合并之前将空白转换为NA
。我保留了verbose = TRUE
,因此您可以看到它确实为您提供了有关如何执行合并的详细信息,包括是否必须在此过程中更改任何值。
out <- Reduce(function(x, y) version.merge(x, y, add.values = TRUE, verbose = TRUE),
lapply(list(x.1, x.2), clean.factors, verbose = FALSE))
# Rows: 3 from `x` #1
# 0 from `y` #2
#
# Columns:
# 1.1 Origin: `x` #1
# 1.2 Origin: `x` #1
# Imputed 1 values from `y` #2
# 2.3 Origin: `x` #1
# Imputed 1 values from `y` #2
# Class missmatch: numeric vs. character
# Converted to character
# 3.4 Origin: `x` #1
out
# 1.1 1.2 2.3 3.4
# a.b w <NA> v z
# b.c <NA> x <NA> <NA>
# d.e y u <NA> <NA>
当然,如果您想再次使用空格替换NA
,则只需使用out[is.na(out)] <- ""
。
答案 1 :(得分:1)
flatx.2 <- which(!x.2 =="", arr.ind=TRUE)
flatx.2[] <- cbind( rownames(x.2)[flatx.2[,'row']],
colnames(x.2)[flatx.2[,'col']])
flatx.2
# contains row and column names in same positions as the non-blank x.2 values
#---------
row col
d.e "d.e" "1.2"
a.b "a.b" "2.3"
#--------------
x.1[ cbind( match(flatx.2[,1], rownames(x.1)), #identify numeric row
match(flatx.2[,2], colnames(x.1))) ] <- #identify numeric col
x.2[which(!x.2 =="", arr.ind=TRUE)] # the non-blank values
x.1
#-------------
1.1 1.2 2.3 3.4
a.b w v z
b.c x
d.e y u
我碰巧认为这只是使用基本索引操作(并且应该相当有效并适用于具有所需技能的数据的结构),所以希望得到一点掌声。我以为我可以在LHS上使用位置的字符值矩阵,但在我的尝试中出错了。 ?"["
页面sems表示应该有效,如果我发出语法错误,这可能会简化。