Как создать подмножества кадра данных на основе столбцов, используя для l oop в R - PullRequest
0 голосов
/ 11 марта 2020

У меня есть кадр данных, который выглядит следующим образом:

   id age1 sex1 age2  sex2 age3  sex3 age4  sex4
1    5    20  <NA>    NA   <NA>    NA   <NA>    27 Female
2   25    NA  <NA>    NA   <NA>    NA   <NA>    35 Female
3   65    NA  <NA>    NA   <NA>    NA   <NA>    NA   <NA>

это код данных:

temp <- structure(list(id = c(5L, 25L, 65L, 25L, 65L, 5L, 5L, 85L, 285L, 
541L), age1 = c(20L, NA, NA, NA, NA, NA, NA, NA, NA, NA), sex1 = structure(c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_), .Label = c("missing", 
"inapplicable", "refusal", "don't know", "inconsistent", "Male", 
"Female"), class = "factor"), age2 = c(NA, NA, NA, NA, 31L, 
NA, NA, NA, NA, NA), sex2 = structure(c(NA, NA, NA, NA, 7L, 
NA, NA, NA, NA, NA), .Label = c("missing", "inapplicable", "refusal", 
"don't know", "inconsistent", "Male", "Female"), class = "factor"), 
    age3 = c(NA, NA, NA, NA, 32L, NA, NA, NA, 25L, 23L), sex3 = structure(c(NA, 
    NA, NA, NA, 7L, NA, NA, NA, 6L, 7L), .Label = c("missing", 
    "inapplicable", "refusal", "don't know", "inconsistent", 
    "Male", "Female"), class = "factor"), age4 = c(27L, 35L, 
    NA, NA, 33L, NA, 24L, NA, 26L, NA), sex4 = structure(c(7L, 
    7L, NA, NA, 7L, NA, 7L, NA, 6L, NA), .Label = c("missing", 
    "inapplicable", "refusal", "don't know", "inconsistent", 
    "Male", "Female"), class = "factor")), row.names = c(NA, 
10L), class = "data.frame")

Я хотел бы знать, как сделать несколько подмножеств на основе данные основаны на столбцах.

Я знаю, что могу сделать это, используя коды:

Subset1<- temp[,1:3]
Subset2<-temp[,c(1,4:5)]
Subset3<- temp[,c(1,6:7)]

Но должен быть более краткий способ сделать это. Я пробовал для l oop, но я новичок в R и не знаю, как это сделать, в том числе поддержание согласованности имен новых подмножеств.

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Вот еще одно базовое решение R

ind <- 1:4
list2env(setNames(lapply(ind, function(k) subset(temp,select = c(1,2*k+(0:1)))),
                  paste0("Subset",ind)),
         envir = .GlobalEnv)

, где subset + lapply было использовано

0 голосов
/ 11 марта 2020

Мы можем использовать split.default для разделения данных на основе числа в именах столбцов и добавления первого столбца в каждом списке.

new_list <- lapply(split.default(temp[-1], gsub("\\D", "", names(temp)[-1])), 
                   function(x) cbind(temp[1], x))
new_list

#$`1`
#    id age_1 sex_1
#1    5    20  <NA>
#2   25    NA  <NA>
#3   65    NA  <NA>
#4   25    NA  <NA>
#5   65    NA  <NA>
#6    5    NA  <NA>
#7    5    NA  <NA>
#8   85    NA  <NA>
#9  285    NA  <NA>
#10 541    NA  <NA>

#$`2`
#    id age_2  sex_2
#1    5    NA   <NA>
#...

Возвращает список фреймов данных. Если вам нужны данные в отдельных фреймах, мы можем сделать:

names(new_list) <- paste0('Subset', seq_along(new_list))
list2env(new_list, .GlobalEnv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...