Итерация функции по списку - PullRequest
0 голосов
/ 23 января 2019

У меня есть список фреймов данных, которые я хочу разделить по переменной. Я пытаюсь автоматизировать этот процесс путем создания функции. Я знаю, что есть функция с именем split, которая делает это, но я пытаюсь научиться создавать функции, поэтому я использую это как практику.

Вот некоторые примеры данных:

Area <- c(1, 5, 5 ,7, 2) 
Protected <- c('protected', 'protected', 'protected', 'unprotected', 'unprotected')
a_data <- data.frame(Area, Protected)

Area <- c(6, 2, 7, 2, 9)
Protected <- c('protected', 'protected', 'protected', 'unprotected', 'unprotected')
b_data <- data.frame(Area, Protected)

Я хочу разделить каждый из них по переменной «Защищено», оставив мне четыре кадра данных: p_a, p_b, u_a и u_b.

Пока мой код такой:

names <- list('a', 'b')

f <- function(x){
  for(i in names){
    d <- paste(i,'_data', sep = '')
    p_'i' <- subset(d, Protected == 'protected')
    u_'i' <- subset(d, Protected == 'unprotected')
  }
}

Это не работает, я уверен, что это потому, что я пытаюсь присвоить текущей итерации i имя переменной, а также пытаюсь присвоить ей значения.

Как мне исправить эту проблему?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вот вариант с bind_rows и split

library(dplyr)
bind_rows(a_data, b_data, .id = 'ind') %>% 
      split(list(.$ind, .$Protected))
0 голосов
/ 23 января 2019

Идея, которая немного меняет вашу функцию, состоит в том, чтобы поместить кадры данных в список и выполнить итерацию напрямую, то есть

lapply(list(a_data, b_data), function(i) { d1 <- subset(i, Protected == 'protected');
                                           d2 <- subset(i, Protected == 'unprotected'); 
                                           return(list(d1, d2))})

, что дает

[[1]]
[[1]][[1]]
  Area Protected
1    1 protected
2    5 protected
3    5 protected

[[1]][[2]]
  Area   Protected
4    7 unprotected
5    2 unprotected


[[2]]
[[2]][[1]]
  Area Protected
1    6 protected
2    2 protected
3    7 protected

[[2]][[2]]
  Area   Protected
4    2 unprotected
5    9 unprotected
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...