作为this question的延续,我现在正在寻找一种方法,在合并时只从y数据框中标记非唯一变量。
suffixes
的默认值是查找长度为2的向量。
说我有这个清单,
a <- list(A = data.frame(id = c(01, 02), a=runif(2), b=runif(2)),
B = data.frame(id = c(01, 02), b=runif(2), c=runif(2)),
C = data.frame(id = c(01, 02), c=runif(2), d=runif(2)))
a
$A
id a b
1 1 0.6922513 0.9966336
2 2 0.9216164 0.8256744
$B
id b c
1 1 0.2242940 0.7058331
2 2 0.4474754 0.9228213
$C
id c d
1 1 0.969796 0.1761250
2 2 0.633697 0.6618188
然后我做了一些自定义,其中我将一些数据框合并在一起,这里以取出一个数据帧为例,
df <- a[[1]]
a <- a[setdiff(names(a), names(a[1]))]
然后我以这种方式合并列表,
for(i in seq_along(a)) {
v <- a[[i]] # extract value
ns <- names(a)
n <- ns[[i]] # extract name
df <-merge(df, v, by.x="id", by.y="id", all.x=T,
suffixes=paste(".", n, sep = ""))
}
df
id a b.B bNA c.C cNA d
1 1 0.6922513 0.9966336 0.2242940 0.7058331 0.969796 0.1761250
2 2 0.9216164 0.8256744 0.4474754 0.9228213 0.633697 0.6618188
如上所示,问题是R为两个非唯一变量添加了标记,但由于我只提供了一个名称n
,因此我在'other'变量上得到NA
。 “在上面的例子中,我从A-data-frame获得了一个.B后缀。
有没有办法可以在两个变量中添加正确的数据框名称,或者(首选)在合并时专门标记y的变量?
答案 0 :(得分:2)
这是一个有趣的小谜题。我在重塑包中欺骗并“借用”了Hadley的merge_recurse
函数:
merge_recurse1 <- function (dfs, ...)
{
n <- length(dfs)
if (!is.null(names(dfs))){
}
if (length(dfs) == 2) {
merge(dfs[[1]], dfs[[2]],all = TRUE,sort = FALSE,
suffixes = c('',names(dfs)[2]), ...)
}
else {
merge(Recall(dfs[-n],...), dfs[[n]],all = TRUE,sort = FALSE,
suffixes = c('',names(dfs)[n]),...)
}
}
> merge_recurse1(a,by = "id")
id a b bB c cC d
1 1 0.2536158 0.6083147 0.3060572 0.1428531 0.6403072 0.4621454
2 2 0.9839910 0.7256161 0.2203161 0.6653415 0.1496376 0.8767888
除了我做的后缀更改之外,我发现我需要向...
添加Recall
参数,以便让merge_recurse
以我认为应该的方式工作。不确定这是一个错误还是我只是误解了这个功能。
答案 1 :(得分:1)
抱歉...我花了一点时间来了解你的问题。但是,你......就像...... 99%那里。
更改参数:
suffixes = paste(".", n, sep = "")
为:
suffixes = c("", paste(".", n, sep = ""))
你应该没问题。通过这样做,我得到了df
,如下所示:
> df
id a b b.B c c.C d
1 1 -0.6039805 0.08297807 0.06426459 2.787147 -0.9566280 -0.36054991
2 2 -0.1694382 -0.95296450 0.37144139 -1.346691 0.7072892 0.09239593
顺便说一句,您是否尝试过早期Stackoverflow帖子中的其他一些建议,而不是所有这些?在某个地方,我记得看到使用Reduce
的东西让我得到了这个局部解决方案(使用原始的“a”数据):
Reduce(function(x, y) merge(x, y, by="id", all=TRUE, suffixes=c("", "_2")),
a, accumulate=FALSE)
为您提供如下输出:
id a b b_2 c c_2 d
1 1 -0.6039805 0.08297807 0.06426459 2.787147 -0.9566280 -0.36054991
2 2 -0.1694382 -0.95296450 0.37144139 -1.346691 0.7072892 0.09239593
这些中的任何一个是否更有用或更接近您所寻找的内容?