假设我在列表中有2个数据框(d1
和d2
)(my.ls
)。我希望在条件之后对每个数据帧进行子集化(例如变量c
等于某些字母,例如l
,m
和n
)并保存所有这些子集数据帧在另一个列表中。
我可以使用lapply
为每个条件执行此操作,但它非常详细。除for loop
之外,是否可以以更智能的方式进行?也许与mapply
?
d1<-data.frame(a=5:1, b=c(rep(2006, times=4),NA), c = letters[10:14])
d2<-data.frame(a=1:5, b=c(2007, 2007, NA, NA, 2007), c = letters[12:16])
my.ls <- list(d1 = d1, d2 = d2)
my_ls_l <- lapply(my.ls, subset, c=="l")
my_ls_m <- lapply(my.ls, subset, c=="m")
my_ls_n <- lapply(my.ls, subset, c=="n")
my_ls_all <- c(my_ls_l,my_ls_m,my_ls_n)
c_values <- c("l","m","n")
# Bit of code that does not work
my_ls_smart <- mapply(subset,my.ls,c_values)
答案 0 :(得分:2)
这是基础R解决方案。我们首先使用lapply
进行子集,然后使用split
进行var c
。要删除0个长度数据帧,我们使用Filter(nrow,...)
lapply(my.ls, function(i) {x <- i[i$c %in% c('l', 'm', 'n'),];
Filter(nrow, split(x, x$c))
#or avoid Filter by split(x, x$c, drop = TRUE) (from @Nate)
})
答案 1 :(得分:0)
这样做:
library(purrr)
c_values %>% map(function(x) map(my.ls, ~subset(., c == x)))
[[1]]
[[1]]$d1
a b c
3 3 2006 l
[[1]]$d2
a b c
1 1 2007 l
[[2]]
[[2]]$d1
a b c
4 2 2006 m
[[2]]$d2
a b c
2 2 2007 m
[[3]]
[[3]]$d1
a b c
5 1 NA n
[[3]]$d2
a b c
3 3 NA n
说明:map
c_values
中map
个dataframe
函数中的value
个值c_values
迭代每个public static function init($dbDetails){
if(isset(self::$connection)){
// here is new mysqli()? connection
return self::$connection;
}
else{
/*
here is NOT - just a DBManager instance
return self::$connection = new DBManager($dbDetails);
instead you should do something like:
*/
return self::$connection = new mysqli($server, $user, $pass, $db);
}
}
,为{{1}}中的每个{{1}}进行子集化}。
答案 2 :(得分:0)
这是一个mapply
#your data
d1<-data.frame(a=5:1, b=c(rep(2006, times=4),NA), c = letters[10:14])
d2<-data.frame(a=1:5, b=c(2007, 2007, NA, NA, 2007), c = letters[12:16])
my.ls <- list(d1=d1, d2=d2)
c_values <- list(c("l","m", "n"))
#result
lapply(mapply(function(i,j){subset(i, c %in% j)}, my.ls, c_values, SIMPLIFY=F),
function(x) split(x, x$c, drop = T))