我有两个描述三种变量之间关系的数据帧。这些数据框如下所示:
df1 <- data.frame(id = c("y1", "y2", "y3"),
x1 = c(1, 0, 0),
x2 = c(0, 1, 0),
x3 = c(0, 1, 1))
df2 <- data.frame(item = c("z1", "z2", "z3"),
x1 = c(1, 1, 1),
x2 = c(0, 1, 0),
x3 = c(0, 1, 1))
实质上,每个数据帧的colnames中标记的x变量解释了y和z变量之间的关系。作为输出,我想要的是y1,y2和y3中的每一个的变量。每个变量应该是与之匹配的z变量的向量。例如,y1应该包含c(z1,z2,z3),因为y1对应于x1,而x1对应于所有三个z项。
我已尝试过各种嵌套for循环和apply语句,到目前为止还无法弄清楚如何执行此操作。
答案 0 :(得分:1)
这样的东西?
library(tidyverse)
df1 %>%
gather(k, v1, -id) %>%
filter(v1 != 0) %>%
inner_join(gather(df2, k,v2, -item) %>% filter(v2 != 0), by="k") %>%
group_by(id) %>%
summarise(n=paste(unique(item), collapse = ","))
# A tibble: 3 x 2
id n
<fctr> <chr>
1 y1 z1,z2,z3
2 y2 z2,z3
3 y3 z2,z3
或试试rowwise
df1 %>%
gather(k, v1, -id) %>%
filter(v1 != 0) %>%
rowwise() %>%
mutate(res=paste(df2$item[ select(df2, k) == 1 ], collapse=",")) %>%
ungroup()
# A tibble: 4 x 4
id k v1 res
<fctr> <chr> <dbl> <chr>
1 y1 x1 1 z1,z2,z3
2 y2 x2 1 z2
3 y2 x3 1 z2,z3
4 y3 x3 1 z2,z3