【发布时间】:2018-02-26 20:17:36
【问题描述】:
假设我在一个列表 (my.ls) 中有 2 个数据框(d1 和 d2)。我想根据条件对每个数据帧进行子集化(例如,变量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)
【问题讨论】:
-
你的意思是
lapply(my.ls, function(i) i[i$c %in% c('l', 'm', 'n'),])? -
@Sotos 将产生 2 个数据帧的列表,其中
c等于l、m或n。我正在考虑获取 6 个数据帧,d1和c==l,d1和c==m,...,d2和c == n -
Fwiw,维护和创建具有相同列的单独数据框在 R 中几乎总是一个坏主意......我只会做
library(data.table); rbindlist(my.ls, id="src")[c %in% c_values]并停在那里。 -
@Frank 完全同意,这只是以客户想要的方式呈现输出的最后一步。
标签: r data.table subset apply lapply