Используя входные данные, показанные в примечании ниже, запустите melt
, показанный в вопросе, а затем преобразуйте value_1
, value_2
и value_3
в 1, 2 и 3, а также добавьте столбец subseq
различать строки, которые в противном случае имеют одинаковый ключ.Избавьтесь от пустых value
строк и преобразуйте их в широкую форму, используя dcast
, удалив столбец subseq
:
library(reshape2)
long <- melt(DF, id.var = "name") # from question
long2 <- transform(long, num = gsub("\\D", "", variable),
subseq = ave(1:nrow(m), name, variable, FUN = seq_along),
variable = NULL)
long3 <- subset(long2, value != "")
wide <- dcast(subseq + num ~ name, data = long3, value.var = "value")[-1]
, получив:
> wide
num AK HU KO
1 1 x z b
2 2 X Z B
3 1 y a c
4 2 Y A C
5 1 m f d
6 2 M F D
7 3 B C B
Проверка на ожидаемое:
identical(wide, expected)
## [1] TRUE
Примечание
Входные данные в воспроизводимой форме:
Lines <- "
name value_1 value_2 value_3
AK x X
AK y Y
AK m M B
HU z Z
HU a A
HU f F C
KO b B
KO c C
KO d D B"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE, fill = TRUE, strip.white = TRUE)
Мы предположили, что num
является фактором, а другие данные являются символами - мыне могу сказать, что было задумано, поскольку входные данные не приведены в воспроизводимой форме в вопросе.
expected <- structure(list(num = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 3L), .Label =
c("1", "2", "3"), class = "factor"), AK = c("x",
"X", "y", "Y", "m", "M", "B"), HU = c("z", "Z", "a", "A", "f",
"F", "C"), KO = c("b", "B", "c", "C", "d", "D", "B")), row.names = c(NA,
-7L), class = "data.frame")
Обновление 2
В этом варианте используются данные 0/1 и целое число num
:
set.seed(123)
# test data
DF2 <- data.frame(name = DF$name,
value_1 = rbinom(9, 1, .5),
value_2 = rbinom(9, 1, .5),
value_3 = ifelse(DF[, 4] == "", NA, rbinom(9, 1, .5)))
long <- melt(DF2, id.var = "name")
long2 <- subset(long, !is.na(value))
long3 <- transform(long2, num = as.integer(gsub("\\D", "", variable)),
subseq = ave(1:nrow(long2), name, variable, FUN = seq_along),
variable = NULL)
wide <- dcast(subseq + num ~ name, data = long3, value.var = "value")[-1]
подача:
> wide
num AK HU KO
1 1 0 1 1
2 2 0 1 1
3 3 1 1 1
4 1 1 1 1
5 2 1 1 0
6 1 0 0 1
7 2 0 0 0