Я не могу использовать переключатель внутри mutate
, потому что он возвращает весь вектор, а не только строку. В качестве хака я использую:
pick <- function(x, v1, v2, v3, v4) {
ifelse(x == 1, v1,
ifelse(x == 2, v2,
ifelse(x == 3, v3,
ifelse(x == 4, v4, NA))))
}
Это работает внутри mutate
, и сейчас это нормально, потому что я обычно выбираю среди 4 вещей, но это может измениться. Можете ли вы порекомендовать альтернативу?
Например:
library(dplyr)
df.faithful <- tbl_df(faithful)
df.faithful$x <- sample(1:4, 272, rep=TRUE)
df.faithful$y1 <- rnorm(n=272, mean=7, sd=2)
df.faithful$y2 <- rnorm(n=272, mean=5, sd=2)
df.faithful$y3 <- rnorm(n=272, mean=7, sd=1)
df.faithful$y4 <- rnorm(n=272, mean=5, sd=1)
Использование pick
:
mutate(df.faithful, y = pick(x, y1, y2, y3, y4))
Source: local data frame [272 x 8]
eruptions waiting x y1 y2 y3 y4 y
1 3.600 79 1 8.439092 5.7753006 8.319372 5.078558 8.439092
2 1.800 54 2 13.515956 6.1971512 6.343157 4.962349 6.197151
3 3.333 74 4 7.693941 6.8973365 5.406684 5.425404 5.425404
4 2.283 62 4 12.595852 6.9953995 7.864423 3.730967 3.730967
5 4.533 85 3 11.952922 5.1512987 9.177687 5.511899 9.177687
6 2.883 55 3 7.881350 1.0289711 6.304004 3.554056 6.304004
7 4.700 88 4 8.636709 6.3046198 6.788619 5.748269 5.748269
8 3.600 85 1 8.027371 6.3535056 7.152698 7.034976 8.027371
9 1.950 51 1 5.863370 0.1707758 5.750440 5.058107 5.863370
10 4.350 85 1 7.761653 6.2176610 8.348378 1.861112 7.761653
.. ... ... . ... ... ... ... ...
Мы видим, что я копирую значение из y1 в y, если x == 1, и так далее. Это то, что я ищу, но хочу иметь возможность сделать это, есть ли у меня список из 4 или 400 столбцов.
Пытаясь использовать switch
:
mutate(df.faithful, y = switch(x, y1, y2, y3, 4))
Error in switch(c(1L, 2L, 4L, 4L, 3L, 3L, 4L, 1L, 1L, 1L, 4L, 3L, 1L, :
EXPR must be a length 1 vector
Пытаясь использовать list
:
mutate(df.faithful, y = list(y1, y2, y3, y4)[[x]])
Error in list(c(8.43909205142925, 13.5159559591257, 7.69394050059568, :
recursive indexing failed at level 2
Попытка использовать c
:
mutate(df.faithful, y = c(y1, y2, y3, y4)[x])
Source: local data frame [272 x 8]
eruptions waiting x y1 y2 y3 y4 y
1 3.600 79 1 8.439092 5.7753006 8.319372 5.078558 8.439092
2 1.800 54 2 13.515956 6.1971512 6.343157 4.962349 13.515956
3 3.333 74 4 7.693941 6.8973365 5.406684 5.425404 12.595852
4 2.283 62 4 12.595852 6.9953995 7.864423 3.730967 12.595852
5 4.533 85 3 11.952922 5.1512987 9.177687 5.511899 7.693941
6 2.883 55 3 7.881350 1.0289711 6.304004 3.554056 7.693941
7 4.700 88 4 8.636709 6.3046198 6.788619 5.748269 12.595852
8 3.600 85 1 8.027371 6.3535056 7.152698 7.034976 8.439092
9 1.950 51 1 5.863370 0.1707758 5.750440 5.058107 8.439092
10 4.350 85 1 7.761653 6.2176610 8.348378 1.861112 8.439092
.. ... ... . ... ... ... ... ...
Ошибок не возникает, но поведение не так, как предполагалось.