2

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

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

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

4

3 回答 3

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)
于 2013-01-22T19:19:48.083 回答
1

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

require(reshape2)
a2 <- melt(a1, value="values")
于 2013-01-22T19:37:52.600 回答
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创建。您可以通过创建 say 来修改此函数,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函数,因为它已经传递了。可能这就是为什么他们不通过...论点?

于 2013-01-22T19:43:18.287 回答