これは 1 つのアプローチですが、行名を修正するためにいくつかの表面的な変更をフォローアップする必要があります。
再現可能な形式のデータ:
mydf <- structure(list(a = c(0, -0.415, 0), b = c(0, 1.415, 0),
c = c(1, 0, 0.0811), d = c(0, 0, 0.918)),
.Names = c("a", "b", "c", "d"),
class = "data.frame", row.names = c("ab", "cd", "ef"))
NA
ゼロをsに置き換えます。
mydf[mydf == 0] <- NA
stack
あなたdata.frame
はそれを「長い」ものにしますdata.frame
:
mydf1 <- data.frame(Rows = rownames(mydf), stack(mydf))
「行」の一意の値を生成します
mydf1$Rows <- make.unique(as.character(mydf1$Rows))
# Let's see what we have so far....
mydf1
# Rows values ind
# 1 ab NA a
# 2 cd -0.4150 a
# 3 ef NA a
# 4 ab.1 NA b
# 5 cd.1 1.4150 b
# 6 ef.1 NA b
# 7 ab.2 1.0000 c
# 8 cd.2 NA c
# 9 ef.2 0.0811 c
# 10 ab.3 NA d
# 11 cd.3 NA d
# 12 ef.3 0.9180 d
ここで、xtabs
探している出力を取得するために使用します。as.data.frame.matrix
が必要な場合はラップし、data.frame
必要に応じて行名をクリーンアップします。
as.data.frame.matrix(xtabs(values ~ Rows + ind, mydf1))
# a b c d
# ab.2 0.000 0.000 1.0000 0.000
# cd -0.415 0.000 0.0000 0.000
# cd.1 0.000 1.415 0.0000 0.000
# ef.2 0.000 0.000 0.0811 0.000
# ef.3 0.000 0.000 0.0000 0.918