假设我们有来自不同学校不同班级的数据,如下所示:
df <- data.frame(school= rep(c("Oldenburg", "Berlin", "Homburg"), each= 4), class= rep(LETTERS[1:4], 3))
现在我需要对数据进行子集化,例如我们可能需要学校
Berlin
班B
和学校Oldenburg
班A
的数据。我们能做的是
subset(df, school == "Berlin" & class == "B" | school== "Oldenburg" & class == "A")
但在其他情况下,我们需要其他学校的其他班级,数据中也可能有一些新学校或新班级。因此,我实际上并不总是能手写学校和班级的名称,而是需要根据两个条件自动对数据进行子集化。
我的尝试是提供两个相同长度的向量,一个表示学校名称,另一个表示班级名称。对于上面的示例,它将是
schools <- c("Berlin", "Oldenburg")
和 classes <- c("B", "A")
。我找不到任何解决方案。有什么想法吗?
我建议创建一个
data.frame
,其中包含您需要过滤的成对学校/班级,然后对它们进行内部联接。
need <- data.frame(school = c("Berlin", "Oldenburg"), class = c("B", "A"))
need
# school class
# 1 Berlin B
# 2 Oldenburg A
### for kicks, just to show that other things in `df` are retained
df$num <- 1:nrow(df)
merge(df, need, by = c("school", "class"))
# school class num
# 1 Berlin B 6
# 2 Oldenburg A 1
我更喜欢用这些制作框架的一个原因是它通常更容易维护:它是一个框架,可以保存为 CSV 或类似的文件,以便于更新,也可以跨平台。它也允许简单的帧操作,例如,如果你想要(比如说)一行的价值,它们
merge(df, need[2,], ...)
或类似的。
有关连接,请参阅:
merge(df, list(school=schools, class=classes))
school class
1 Berlin B
2 Oldenburg A
subset(df, paste(school, class) %in% paste(schools, classes))
school class
1 Oldenburg A
6 Berlin B