Вот один вариант, в котором мы циклически перебираем столбец, преобразуем его в индекс с помощью match
, используя значения со значениями unique
в этом столбце ('m1'), получая colMaxs
(из matrixStats
). ), используйте его для добавления к столбцам m1, начиная со 2-го столбца
m1 <- sapply(df1, function(x) match(x, unique(x)))
library(matrixStats)
v1 <- colMaxs(m1)
#or in base R
# v1 <- apply(m1, 2, max)
m1[,-1] <- m1[,-1] + cumsum(v1[-length(v1)])[col(m1[,-1])]
m1
# A1 A2 A3
# [1,] 1 5 10
# [2,] 2 5 11
# [3,] 1 6 11
# [4,] 2 7 11
# [5,] 3 8 10
# [6,] 4 9 11
# [7,] 2 9 11
# [8,] 3 8 10
# [9,] 4 7 10
Если мы хотим получить второй набор данных
library(rowr)
out <- do.call(cbind.fill, c(Map(function(x, y)
data.frame(col1 = x, col2 = unique(y)),
lapply(df1, unique), split(m1, col(m1))), fill = NA))
names(out) <- c(rbind(names(df1), paste0("C", seq_along(df1))))
out
# A1 C1 A2 C2 A3 C3
#1 So,Smith 1 Amo, Bazse 5 Arzo, Ghas 10
#2 Jo, Man 2 Hosh,Golab 6 Imran, Maz 11
#3 Rose,Moli 3 Jo, Man 7 <NA> <NA>
#4 Goli,Gouzo 4 Niss, Peak 8 <NA> <NA>
#5 <NA> <NA> Ebi,Sat 9 <NA> <NA>
data
df1 <- structure(list(A1 = c("So,Smith", "Jo, Man", "So,Smith", "Jo, Man",
"Rose,Moli", "Goli,Gouzo", "Jo, Man", "Rose,Moli", "Goli,Gouzo"
), A2 = c("Amo, Bazse", "Amo, Bazse", "Hosh,Golab", "Jo, Man",
"Niss, Peak", "Ebi,Sat", "Ebi,Sat", "Niss, Peak", "Jo, Man"),
A3 = c("Arzo, Ghas", "Imran, Maz", "Imran, Maz", "Imran, Maz",
"Arzo, Ghas", "Imran, Maz", "Imran, Maz", "Arzo, Ghas", "Arzo, Ghas"
)), class = "data.frame", row.names = c(NA, -9L))