在循环合并时专门标记y的变量

时间:2012-04-29 04:49:45

标签: r for-loop merge customization

作为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的变量?

2 个答案:

答案 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

这些中的任何一个是否更有用或更接近您所寻找的内容?