4

これは単純な質問なので、以前に尋ねた人への参照が見つからないことに驚いています。それはこれと同じではなく、この議論の対象にもなりません。

名前付きのdimnamesを持つ4-dマトリックス(寸法16x10x15x39)があります(csvなどからデータフレームを取得すると発生しますcast。dimnamesの名前を取得しますnames(dimnames(matrix))

次に、列 (つまり、最初の次元) を行の合計の一部に置き換えたいので、次のようにします。

matrix2 <- apply(matrix1, c(2,3,4), function(x){x/sum(x)})

しかし、今names(dimnames(matrix2))は最初の次元が空白です。他の dimname 名は保持されています。

では、名前付きのディメンション名を持つマトリックスを実行applyし、残りのすべてのディメンションの名前を保持するにはどうすればよいでしょうか?

再現可能な例

問題の簡単な例を次に示します。コード全体を実行して、最後の 2 行を確認してください。

x <- data.frame(
  name=c("bob","james","sarah","bob","james",
         "sarah","bob","james","sarah","bob",
         "james","sarah"),
  year=c("1995","1995","1995","1995","1995",
         "1995","2005","2005","2005","2005",
         "2005","2005"),
  sample_num=c("sample1","sample1","sample1",
               "sample2","sample2","sample2",
               "sample1","sample1","sample1",
               "sample2","sample2","sample2"),
  value=c(1,2,3,2,3,4,1,2,3,2,3,4)
  )
x <- cast(x, sample_num ~ name ~ year)
x_fractions <- apply(y,c(2,3),function(x){x / sum(x)})

names(dimnames(x))
names(dimnames(x_fractions))
4

3 に答える 3

0

キャストされていない配列を使用してこの動作を再現することはできません。データフレーム/配列が実際にどのように見えるかの再現可能な例を提供できますか? そうしないと、問題がどこにあるかを見つけるのが難しくなります。

これをテストするために使用したコードは次のとおりです。

# example
a <- c(1,2,11,22)
b <- c(3,4,33,44)
c <- c(5,6,55,66)
d <- c(7,8,77,88)

test <- array(c(a,b,c,d), c(2,2,2,2), dimnames=list(
a=c("a1","a2"),
b=c("b1","b2"),
c=c("c1","c2"),
d=c("d1","d2") )
)
dimnames(test)
names(dimnames(test))

# apply
test2 <- apply(test, c(2,3,4), function(x){
  entry <- sum(x)
})
dimnames(test2)
names(dimnames(test2))

答えとして「偽装」のコメントを申し訳ありません。私は SO が初めてで、コメントを投稿するにはより高い担当者が必要なようです。

編集:dimnames何らかの理由で、定義した関数が名前のない結果を生成するため、迷子になる可能性があります。x/sum(x)(私のように) オブジェクトとして保存してから、関数内でそのオブジェクトに名前を付けることができます。最後の部分は飛ばしましたnamesdimnames

于 2013-02-14T13:17:50.473 に答える