符合特定变化条件的列表中的子集数据帧

时间:2017-09-18 10:16:25

标签: r data.table subset apply lapply

假设我在列表中有2个数据框(d1d2)(my.ls)。我希望在条件之后对每个数据帧进行子集化(例如变量c等于某些字母,例如lmn)并保存所有这些子集数据帧在另一个列表中。

我可以使用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)

3 个答案:

答案 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_valuesmapdataframe函数中的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))