data.table
решение:
данные: (убедитесь, что у вас нет факторов stringsAsFactors = F
)
data <- data.frame(
city=c("A","B","C","D","E","F","G"),
score=c(83,94,1,21,2,3,0),
number=c(2,0,1,0,3,0,0),
number2=c(0,2,0,3,0,1,0),
number3=c(1,1,0,4,0,0,0),stringsAsFactors = F)
код: (давайте возьмем функцию fun1
, которая сделает всю работу за нас)
data.table::setDT(data)
fun1 <- function(x) {
transpose(
transpose(
lapply(x, function(u) if(u != 0) rep(1,u) else 0), fill = 0
)
)
}
data[, structure(fun1(.SD), .Names = names(.SD)), by = c("city","score")]
результат:
# city score number number2 number3
#1: A 83 1 0 1
#2: A 83 1 0 0
#3: B 94 0 1 1
#4: B 94 0 1 0
#5: C 1 1 0 0
#6: D 21 0 1 1
#7: D 21 0 1 1
#8: D 21 0 1 1
#9: D 21 0 0 1
#10: E 2 1 0 0
#11: E 2 1 0 0
#12: E 2 1 0 0
#13: F 3 0 1 0
#14: G 0 0 0 0