我想将堆栈用于数据框,并保留原始数据框中的重复列名。
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行中的模式(字符串)?
最后,我在这里问我在论坛上的第一个问题。谢谢你的帮助。
答案 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
函数,因为它已经过了。可能这就是为什么他们没有通过...
论证?