我有一个在R中具有嵌套结构的数据集(某些单元格是其原始JSON结构的数组)。
set.seed(123)
data = list()
data$nested_df_1 = data.frame(a = letters[1:10]
, b = round(rnorm(10), 0))
data$nested_df_2 = list()
data$nested_df_2$nested_df_2_1 = data.frame(c = letters[11:20]
, d = sample(-100:100, 10))
现在,我想对整个列表data
进行子集化,以使其仅包括data$nested_df_1$b >= 0
所在的所有实例(=所有结构中的所有行)。
> data$nested_df_1
a b
1 a -1
2 b 0
3 c 2
4 d 0
5 e 0
6 f 2
7 g 0
8 h -1
9 i -1
10 j 0
因此:需要从整个结构中删除第1、8、9行(即从data$nested_df_1
和data$nested_df_2$nested_df_2_1
中删除。
如果我只是想在data$nested_df_1
数据帧中使用它,我可以这样做:
data$nested_df_1 = data$nested_df_1[data$nested_df_1$b >= 0, ]
(索引保持恒定,即,如果row_i
中的data$nested_df_1
满足标准,那么对于row_i
中的data$nested_df_2$nested_df_2_1
也是如此)
但是如何为整个嵌套结构创建子集?
[我们可以创建一个逻辑索引,如果它是list
data.frame
,则遍历subset
,否则就遍历list
和subset
(假设list
嵌套的深度为2)] >
i1 <- data$nested_df_1$b >= 0
lapply(data, function(x) if(is.data.frame(x)) subset(x, i1) else
lapply(x, function(y) subset(y, i1)))