Вот один подход, но вы должны следовать с некоторыми косметическими изменениями для фиксации имен строк.
Ваши данные в воспроизводимой форме:
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"))
Replace нули с 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
Останется ли потерял свой статус как число? Просто любопытно: Какова конечная цель/цель для этого? – A5C1D2H2I1M1N2O1R2T1