我有一个数据框列表,我想按一个变量进行拆分。我试图通过创建一个函数来自动化此过程。我知道有一个名为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的当前迭代分配给变量的名称,同时还尝试为其分配值。
如何解决此问题?
答案 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_rows
和split
的选项
library(dplyr)
bind_rows(a_data, b_data, .id = 'ind') %>%
split(list(.$ind, .$Protected))