1

作为这个问题的延续,我现在正在寻找一种方法来在合并时仅标记 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所以我NA在“其他”变量上得到了一个标记。在上面的示例中,我从 A 数据帧中获得了变量的 .B 后缀。

有没有一种方法可以将正确的数据框名称添加到两个变量中,或者(首选)在合并时专门标记 y 的变量?

4

2 回答 2

2

这是一个有趣的小谜题。我在reshape包中从 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

除了我所做的后缀更改之外,我发现我需要添加一个...参数才能Recallmerge_recurse我认为应该的方式开始工作。不知道这是一个错误还是我只是误解了这个功能。

于 2012-04-29T05:36:21.757 回答
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

这些中的任何一个更有用或更接近您正在寻找的东西吗?

于 2012-04-30T16:41:16.573 回答