Я надеюсь определить эффективный способ преобразования одного фрейма данных в список фреймов данных. Ниже приведен мой воспроизводимый MWE:
set.seed(1)
ABAge = runif(100)
ABPoints = rnorm(100)
ACAge = runif(100)
ACPoints = rnorm(100)
BCAge = runif(100)
BCPoints = rnorm(100)
A_B <- data.frame(ID = as.character(paste0("ID", 1:100)), Age = ABAge, Points = ABPoints)
A_C <- data.frame(ID = as.character(paste0("ID", 1:100)), Age = ACAge, Points = ACPoints)
B_C <- data.frame(ID = as.character(paste0("ID", 1:100)), Age = BCAge, Points = BCPoints)
A_B$ID <- as.character(A_B$ID)
A_C$ID <- as.character(A_C$ID)
B_C$ID <- as.character(B_C$ID)
listFormat <- list("A_B" = A_B, "A_C" = A_C, "B_C" = B_C)
dfFormat <- data.frame(ID = as.character(paste0("ID", 1:100)), A_B.Age = ABAge, A_B.Points = ABPoints, A_C.Age = ACAge, A_C.Points = ACPoints, B_C.Age = BCAge, B_C.Points = BCPoints)
dfFormat$ID = as.character(dfFormat$ID)
В результате получается формат фрейма данных (dfFormat
), который выглядит следующим образом:
'data.frame': 100 obs. of 7 variables:
$ ID : chr "ID1" "ID2" "ID3" "ID4" ...
$ A_B.Age : num 0.266 0.372 0.573 0.908 0.202 ...
$ A_B.Points: num 0.398 -0.612 0.341 -1.129 1.433 ...
$ A_C.Age : num 0.6737 0.0949 0.4926 0.4616 0.3752 ...
$ A_C.Points: num 0.409 1.689 1.587 -0.331 -2.285 ...
$ B_C.Age : num 0.814 0.929 0.147 0.75 0.976 ...
$ B_C.Points: num 1.474 0.677 0.38 -0.193 1.578 ...
и список фреймов данных listFormat
это выглядит так:
List of 3
$ A_B:'data.frame': 100 obs. of 3 variables:
..$ ID : chr [1:100] "ID1" "ID2" "ID3" "ID4" ...
..$ Age : num [1:100] 0.266 0.372 0.573 0.908 0.202 ...
..$ Points: num [1:100] 0.398 -0.612 0.341 -1.129 1.433 ...
$ A_C:'data.frame': 100 obs. of 3 variables:
..$ ID : chr [1:100] "ID1" "ID2" "ID3" "ID4" ...
..$ Age : num [1:100] 0.6737 0.0949 0.4926 0.4616 0.3752 ...
..$ Points: num [1:100] 0.409 1.689 1.587 -0.331 -2.285 ...
$ B_C:'data.frame': 100 obs. of 3 variables:
..$ ID : chr [1:100] "ID1" "ID2" "ID3" "ID4" ...
..$ Age : num [1:100] 0.814 0.929 0.147 0.75 0.976 ...
..$ Points: num [1:100] 1.474 0.677 0.38 -0.193 1.578 ...
Я надеюсь предложить автоматизированный способ преобразования dfFormat
в listFormat
. Как видно из вышеприведенных объектов, есть два основных условия:
Столбец ID
всегда является первым столбцом в dfFormat
и всегда является первым столбцом в каждом подсписке. из listFormat
.
Количество подсписков равно количеству уникальных имен столбцов в dfFormat
перед подчеркиванием ('_'). В этом случае это три префикса (например, «A_B», «A_ C» и «B_ C»). Эти префиксы также являются именами трех подсписков.
В каждом подсписке он содержит количество столбцов, имеющих связанный префикс («A_B»). Для каждого подсписка это было два («Возраст» и «Очки»). Эти суффиксы являются именами столбцов.
Я задал обратный вопрос здесь (т.е. как go с listFormat
до dfFormat
) и получил несколько полезных ответов, из которых я учусь. Мне нужно иметь код, чтобы поменять оба направления, и кажется, что обратному направлению могут потребоваться новые типы кода. Ниже я попытаюсь показать, как я застрял!
conUnd <- which(sapply(colnames(dfFormat), function(x) grepl("_", x)))
listName <- sapply(colnames(dfFormat[,conUnd]), function(x) strsplit(x, "[.]")[[1]][1])
uListName <- unique(sapply(colnames(dfFormat[,conUnd]), function(x) strsplit(x, "[.]")[[1]][1]))
listCol <- sapply(colnames(dfFormat[,conUnd]), function(x) strsplit(x, "[.]")[[1]][2])
listFormat = list()
for (i in 1:length(uListName)){
[Gets messy here trying to define column names based on string variables]
}
Буду признателен за любой совет. Я знаю, что мой код неэффективен.