【问题标题】:Stack with duplicate column names具有重复列名的堆栈
【发布时间】:2013-01-22 19:06:51
【问题描述】:

我想对数据框使用堆栈并保留原始数据框中的重复列名。

a1<-data.frame(1:10,11:20,21:30)
colnames(a1)<-c('a','b','a')
a2<-stack(a1)

以上为 a2 中“a”的重复列名添加了“a.1”。我想将其保留为“a”。堆栈中是否有任何选项?

另外,我尝试使用循环替换所有“a1.1”。我在有许多重复名称的大表中没有成功。有没有更好的例子来替换 r 行中的模式(字符串)?

最后,我在这里问我在论坛上的第一个问题。感谢您的帮助。

【问题讨论】:

  • melt 包中的 melt 函数将执行此操作。提供check.names=FALSE 并没有帮助我有点惊讶......
  • @Arun 但它确实有一个 ... 参数传递给其他方法。

标签: r stack


【解决方案1】:

通过查看stack 的代码:

> getS3method('stack', 'default')

function (x, ...) 
{
    x <- as.list(x)
    keep <- unlist(lapply(x, is.vector))
    if (!sum(keep)) 
        stop("at least one vector element is required")
    if (!all(keep)) 
        warning("non-vector elements will be ignored")
    x <- x[keep]
    data.frame(values = unlist(unname(x)), ind = factor(rep.int(names(x), 
        lapply(x, length))), stringsAsFactors = FALSE)
}

如您所见,... 参数未传递给 data.frame 创建。您可以通过创建 stack2 来修改此函数,如下所示:

stack2 <- function (x, ...) 
{
    x <- as.list(x)
    keep <- unlist(lapply(x, is.vector))
    if (!sum(keep)) 
        stop("at least one vector element is required")
    if (!all(keep)) 
        warning("non-vector elements will be ignored")
    x <- x[keep]
    data.frame(values = unlist(unname(x)), ind = factor(rep.int(names(x), 
        lapply(x, length))), stringsAsFactors = FALSE, ...) # note the ... here
}
# after copy/paste of stack2 function
> stack2(a1, check.names = FALSE)
   values ind
1       1   a
2       2   a
3       3   a
4       4   a
5       5   a
6       6   a
7       7   a
8       8   a
9       9   a
10     10   a
11     11   b
12     12   b
13     13   b
14     14   b
15     15   b
16     16   b
17     17   b
18     18   b
19     19   b
20     20   b
21     21   a
22     22   a
23     23   a
24     24   a
25     25   a
26     26   a
27     27   a
28     28   a
29     29   a
30     30   a

注意:不要将 stringsAsFactors = . 参数传递给这个 stack2 函数,因为它已经传递了。可能这就是他们不通过 ... 参数的原因?

【讨论】:

    【解决方案2】:

    正如 Arun 所说,reshape2 会发出警告:

    require(reshape2)
    a2 <- melt(a1, value="values")
    

    【讨论】:

    • 我试过了,但它替换了第一个“a”的值。重复的“a”的值应该是 21-30,但它的值是 1-10。
    【解决方案3】:

    这是一个使用 base R 的通用解决方案:

    # combine column namesakes
    a2<-sapply(unique(names(a1)), 
           function(name) do.call(c, a1[(names(a1) == name)]), 
           USE.NAMES=TRUE,
           simplify=FALSE) # for case when a1 has one row and no duplicate col names
    stack(a2)
    

    【讨论】:

      猜你喜欢
      • 2015-09-10
      • 1970-01-01
      • 2017-06-06
      • 2011-04-13
      • 2011-09-25
      • 1970-01-01
      • 2021-02-06
      • 2021-10-26
      • 1970-01-01
      相关资源
      最近更新 更多