遍历列表的函数

时间:2019-01-23 13:06:21

标签: r

我有一个数据框列表,我想按一个变量进行拆分。我试图通过创建一个函数来自动化此过程。我知道有一个名为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)

我想沿着变量'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 :(得分:4)

稍微改变功能的想法是将数据帧放入列表中并直接进行迭代,即

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

答案 1 :(得分:1)

这里是bind_rowssplit的选项

library(dplyr)
bind_rows(a_data, b_data, .id = 'ind') %>% 
      split(list(.$ind, .$Protected))