【发布时间】:2017-10-24 13:48:02
【问题描述】:
我想在不使用 expand.grid 的情况下重塑 tibble。虽然 expand.grid + 删除丢失的 obs + 删除“翻转重复”(即 a,b 与 b,a 相同)应该可以工作,但如果我有许多组合,计算起来会很慢。
这是我想要实现的虚拟版本:
library(dplyr)
library(tidyr)
initial_data <- tibble(x = c("east","east","east"), y = c("a","b","c"), z = c(0.1,0.2,0.3))
> initial_data
# A tibble: 3 x 3
x y z
<chr> <chr> <dbl>
1 east a 0.1
2 east b 0.2
3 east c 0.3
final_data <- tibble(x = c("east","east","east"), y1 = c("a","a","b"), y2 = c("b","c","c"), z1 = c(0.1,0.1,0.2), z2 = c(0.2,0.3,0.3))
> final_data
# A tibble: 3 x 5
x y1 y2 z1 z2
<chr> <chr> <chr> <dbl> <dbl>
1 east a b 0.1 0.2
2 east a c 0.1 0.3
3 east b c 0.2 0.3
这可行,但效率极低:
expand_data <- as_tibble(expand.grid(initial_data$x, initial_data$y, initial_data$y)) %>%
filter(Var2 != Var3) %>%
distinct()
index <- !duplicated(t(apply(expand_data, 1, sort)))
expand_data <- expand_data[index, ] %>%
left_join(initial_data, by = c("Var1" = "x", "Var2" = "y")) %>%
left_join(initial_data, by = c("Var1" = "x", "Var3" = "y"))
> expand_data
# A tibble: 3 x 5
Var1 Var2 Var3 z.x z.y
<chr> <chr> <chr> <dbl> <dbl>
1 east b a 0.2 0.1
2 east c a 0.3 0.1
3 east c b 0.3 0.2
非常感谢提前!!
【问题讨论】:
-
你能更详细地解释你的问题吗?我无法理解您要获得的最终格式。