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

byのコードを見ると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を渡さない理由ですか?...

于 2013-01-22T19:43:18.287 に答える
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

アルンが言っreshape2たように、警告付きでこれを行います:

require(reshape2)
a2 <- melt(a1, value="values")
于 2013-01-22T19:37:52.600 に答える