我有两个数据帧(elementdf
和nodedf
),如果数据帧之间的elementdf
匹配且nid
的z字段> = 90,我想要第二个(nodedf
)的子集。
v1 <- c(1, 2, 3, 4, 5, 6, 8, 9)
v2 <- c(90, 90, 90, 40, 20, 20, 80, 80)
nodedf <- data.frame(v1, v2)
names(nodedf) <- c("nid", "z")
v3 <- c(1, 2)
v4 <- c(1, 5)
v5 <- c(2, 6)
v6 <- c(3, 7)
v7 <- c(4, 9)
elementdf <- data.frame(v3, v4, v5, v6, v7)
names(elementdf) <- c("eid", "n1", "n2", "n3", "n4")
我不需要nid
中的每个elementdf
都是TRUE
:只要有一个,那么它就有资格获得子集(只要它的nid
也> = 90)。
期望的输出是:
eid n1 n2 n3 n4
1 1 1 2 3 4
拥有宽格式的数据会使这更难。在这里,我们使用tidyr
进行一些重塑以使连接成为可能。
library(dplyr)
library(tidyr)
elementdf %>%
gather(source, nid, -eid) %>%
inner_join(nodedf %>% filter(z>=90)) %>%
semi_join(elementdf, .)