对于示例数据框:
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。
非常感谢。
答案 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