堆叠有重复的列名称

时间:2013-01-22 19:06:52

标签: r stack

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

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行中的模式(字符串)?

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

3 个答案:

答案 0 :(得分:1)

这是使用基础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)

答案 1 :(得分:1)

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

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

答案 2 :(得分: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函数,因为它已经过了。可能这就是为什么他们没有通过...论证?