这是一种方法,但您需要跟进一些外观更改以修复行名称。
您的数据以可重现的形式:
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"))
用 s 替换零NA
:
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