Извлечение и связывание одноименных переменных в data.frame в R - PullRequest
1 голос
/ 05 октября 2019

У меня есть cbind из 2 data.frames под названием DATA. Используя BASE R , мне было интересно, как я могу извлечь и затем cbind переменные с одинаковыми именами в DATA и сохранить их в виде списка?

Для приведенного ниже примера я хочувсе переменные AA с и отдельно все переменные BB с в DATA должны быть отдельно cbind редактироваться и сохраняться в виде списка?

Примечание: имена могут быть любыми, а число переменных может быть любым. Решение функции (al) высоко ценится.

Примечание: предположим, что у нас НЕТ ДОСТУПА к r, единственный вход - DATA.

r <- list(
 data.frame(Name = rep("Jacob", 6), 
           X = c(2,2,1,1,NA, NA), 
           Y = c(1,1,1,2,1,NA), 
           Z = rep(3, 6), 
         out = rep(1, 6)), 

 data.frame(Name = rep("Jon", 6), 
           X = c(1,NA,3,1,NA,NA), 
           Y = c(1,1,1,2,NA,NA), 
           Z = rep(2, 6), 
         out = rep(1, 6)), 

 data.frame(Name = rep("Jon", 6), 
            X = c(1,NA,3,1,NA,NA), 
            Y = c(1,1,1,2,2,NA), 
            Z = rep(2, 6), 
          out = rep(2, 6)), 

 data.frame(Name = rep("Jim", 6), 
            X = c(1,NA,3,1,NA,NA), 
            Y = c(1,1,1,2,2,NA), 
            Z = rep(2, 6), 
          out = rep(1, 6)))

DATA <- do.call(cbind, r)  ## DATA: cbind of two data.frames

1 Ответ

1 голос
/ 05 октября 2019

Вот вариант с split. Не рекомендовал бы иметь одинаковые повторяющиеся имена столбцов в наборе данных. Но, если это действительно необходимо, после вас split измените имена столбцов, удалив ., следующий за одним или несколькими числами в конце, с sub

nm1 <- Reduce(intersect, lapply(r, colnames)) # get the common names
lst1 <- split.default(DATA[names(DATA) %in% nm1], names(DATA)[names(DATA) %in% nm1])
lapply(lst1, function(x) setNames(x, sub("\\.\\d+$", "", names(x))))

Или если нам нужно использовать только «ДАННЫЕ», а не «r» для поиска имен столбцов intersec. Это сложно, но мы можем получить частоту появления имен столбцов и выбрать 2 с частотой

tbl <- table(names(DATA))
nm1 <- names(which(tbl==max(tbl)))

Использовать это в split.default, как и раньше

lst1 <- split.default(DATA[names(DATA) %in% nm1], names(DATA)[names(DATA) %in% nm1])
lapply(lst1, function(x) setNames(x, sub("\\.\\d+$", "", names(x))))

Используя новый пример OP

r <- list( data.frame( AA = c(2,2,1,1,3,2), BB = c(1,1,1,2,2,NA), CC = 1:6), data.frame( AA = c(1,NA,3,1,3,2), BB = c(1,1,1,2,2,2)), data.frame( AA = c(1,NA,3,1,3,2), BB = c(1,1,1,2,2,2), DD = 0:5) )
DATA <- do.call(cbind, r)

tbl <- table(names(DATA))
nm1 <- names(which(tbl==max(tbl)))
lst1 <- split.default(DATA[names(DATA) %in% nm1], names(DATA)[names(DATA) %in% nm1])
lapply(lst1, function(x) setNames(x, sub("\\.\\d+$", "", names(x))))
#$AA
#  AA AA AA
#1  2  1  1
#2  2 NA NA
#3  1  3  3
#4  1  1  1
#5  3  3  3
#6  2  2  2

#$BB
#  BB BB BB
#1  1  1  1
#2  1  1  1
#3  1  1  1
#4  2  2  2
#5  2  2  2
#6 NA  2  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...