子集列表基于R中的条件

时间:2016-06-29 11:16:14

标签: r dataframe subset

对于示例数据框:

df <- structure(list(area = structure(c(1L, 4L, 3L, 8L, 5L, 7L, 6L, 
2L), .Label = c("DE1", "DE3", "DE4", "DE5", "DE9", "DEA", "DEB", 
"DEC"), class = "factor"), to.delete = c(1L, 0L, 1L, 0L, 1L, 
1L, 1L, 0L)), .Names = c("area", "to.delete"), class = "data.frame", row.names = c(NA, 
-8L))

我想创建一个'to'delete'列中包含'1'的区域列表。我知道如何从这个数据帧中对1进行子集化,但是我想要区域列表,因为最终我将使用此列表从主要主数据文件中提取这些区域(df2,如下所示)。

df2 <- structure(list(id = 1:24, area = structure(c(1L, 1L, 4L, 4L, 
4L, 3L, 3L, 3L, 3L, 3L, 8L, 8L, 8L, 8L, 5L, 7L, 7L, 7L, 6L, 6L, 
2L, 2L, 2L, 2L), .Label = c("DE1", "DE3", "DE4", "DE5", "DE9", 
"DEA", "DEB", "DEC"), class = "factor")), .Names = c("id", "area"
), class = "data.frame", row.names = c(NA, -24L))

我更喜欢分两步完成此操作,因此我可以轻松查看已删除的区域(感谢下面的答案以获取使用列表的建议)。

a <- list(df$area[df$to.delete == 1])
df2.subset <- df2[df2$area %in% a,]

但目前这似乎不起作用,所以如果有人有任何想法,那就太棒了。

df2应该只剩下区域DE5,DEC和DE3。

非常感谢。

4 个答案:

答案 0 :(得分:1)

我们可以使用subset。根据描述,OP希望subset基于&#39;区域的主数据行(&#39; maindata&#39;)。这相当于1中的#todelete&#39;柱。在这种情况下,我们提取“&#39;区域&#39; (df$area[df$to.delete ==1])和%in%我们将&#39; maindata&#39;

分配。

subset(maindata, area %in% df$area[df$to.delete==1])

答案 1 :(得分:1)

你的要求不太清楚。

这将创建一个列表,其中每个元素都是不同的区域:

lapply(df$area[df$to.delete == 1], function(x) x)

如果您想要一个只包含一个包含所有区域的元素的列表:

list(df$area[df$to.delete == 1])

编辑: 要回答你问题的第二部分:

a <- list(df$area[df$to.delete == 1])
df2.subset <- df2[!df2$area %in% a[[1]], ]

答案 2 :(得分:1)

以下是使用split将区域收集到两个列表中的另一种方法:

# get two lists of areas and give list items appropriate names
keepDrop <- setNames(split(df$area, df$to.delete), c("drop", "keep"))

# now perform dropping
df2.smaller <- df2[df2$area %in% keepDrop[["keep"]],]

答案 3 :(得分:0)

这是你可以尝试的。

a <- as.list(subset(df,df$to.delete == 1)) 


> a
$area
[1] DE1 DE4 DE9 DEB DEA
Levels: DE1 DE3 DE4 DE5 DE9 DEA DEB DEC

$to.delete
[1] 1 1 1 1 1