次のデータがあるとします。
data = tibble::tribble(
~id, ~year_1, ~year_2, ~cod_1, ~cod_2, ~cod_3, ~cod_4, ~var_x,
1, 0, 1, 5, 5, 3, 6, "x",
1, 0, 1, 3, 6, 14, 5, "x",
1, 0, 1, 2, 8, 5, 4, "x",
2, 1, 0, 10, 8, 2, 3, "x",
2, 1, 0, 3, 9, 1, 2, "x",
2, 1, 0, 1, 12, 0, 1, "x"
)
すべての列「year_」とすべての列「cod_」の組み合わせで可能なすべての製品を作成したいと思います。私はこのようなことを意味します:
data.new = data %>%
mutate(year_1_cod_1 = year_1 * cod_1) %>%
mutate(year_1_cod_2 = year_1 * cod_2) %>%
mutate(year_1_cod_3 = year_1 * cod_3) %>%
mutate(year_1_cod_4 = year_1 * cod_4) %>%
mutate(year_2_cod_1 = year_2 * cod_1) %>%
mutate(year_2_cod_2 = year_2 * cod_2) %>%
mutate(year_2_cod_3 = year_2 * cod_3) %>%
mutate(year_2_cod_4 = year_2 * cod_4)
私は以下を使用してすべての可能な組み合わせを得ることができます:
year.var = colnames(data[, grepl("year", names(data))])
cod.var = colnames(data[, grepl("cod", names(data))])
com = crossing(year.var, cod.var)
> com
# A tibble: 8 x 2
year.var cod.var
<chr> <chr>
1 year_1 cod_1
2 year_1 cod_2
3 year_1 cod_3
4 year_1 cod_4
5 year_2 cod_1
6 year_2 cod_2
7 year_2 cod_3
8 year_2 cod_4
forループを使用して、com
データフレーム上を移動し、新しい各列を作成できます。しかし、私はこれをdplyr::
環境内で行いたいと思います。私は私が使用することができると思うpurrr::
のmutate
すべての組み合わせの上に、私はどのように確認していません。
実際、私の実際のデータでは、1,000を超える可能な組み合わせ(つまり、変更する変数が1,000を超える)があります。
を使用map2
して、の組み合わせをループし、非標準の評価を使用してそれらの列を乗算し、最後に元のデータフレームにバインドすることにより、新しい列を作成するためにcom
使用transmute
できます。
library(dplyr)
library(purrr)
data %>%
bind_cols(map2_dfc(com$year.var, com$cod.var,
~data %>% transmute(!!paste(.x, .y, sep = "_") := !!sym(.x) * !!sym(.y))))
# A tibble: 6 x 16
# id year_1 year_2 cod_1 cod_2 cod_3 cod_4 var_x year_1_cod_1 year_1_cod_2
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <dbl>
#1 1 0 1 5 5 3 6 x 0 0
#2 1 0 1 3 6 14 5 x 0 0
#3 1 0 1 2 8 5 4 x 0 0
#4 2 1 0 10 8 2 3 x 10 8
#5 2 1 0 3 9 1 2 x 3 9
#6 2 1 0 1 12 0 1 x 1 12
# … with 6 more variables: year_1_cod_3 <dbl>, year_1_cod_4 <dbl>,
# year_2_cod_1 <dbl>, year_2_cod_2 <dbl>, year_2_cod_3 <dbl>,
# year_2_cod_4 <dbl>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加