x
選択が各行に固有の場合、1 つの列の値 (たとえば、以下) を使用して、可能な列の中から値を選択するにはどうすればよいですか?
variableは、指定された行に対してx
variable a
、b
、またはを選択する必要があるかどうかを決定します。c
簡単な例を次に示します。実際のセルは、列名と行番号を連結したものではありません。
library(magrittr); requireNamespace("tibble"); requireNamespace("dplyr")
ds <- tibble::tibble(
x = c( 1 , 1 , 2 , 3 , 1 ),
a = c("a1", "a2", "a3", "a4", "a5"),
b = c("b1", "b2", "b3", "b4", "b5"),
c = c("c1", "c2", "c3", "c4", "c5")
)
必要な列の値は次のとおりです。
# ds$y_desired <- c("a1", "a2", "b3", "c4", "a5")
# ds$column_desired <- c("a" , "a" , "b" , "c" , "a" )
もちろん、次の例では 1 列ではなく、5 列が生成されます。
ds[, ds$column_desired]
そして、以下はエラーを生成します:
Error in mutate_impl(.data, dots) : basic_string::_M_replace_aux
.
ds %>%
dplyr::rowwise() %>%
dplyr::mutate(
y = .[[column_desired]]
) %>%
dplyr::ungroup()
実際のシナリオで選択肢が 2 つまたは 3 つしかない場合は、おそらくネストされた if を使用しますが、より多くの条件に対応するために一般化されたマッピング アプローチが必要です。
ds %>%
dplyr::mutate(
y_if_chain = ifelse(x==1, a, ifelse(x==2, b, c))
)
理想的には、このアプローチは、ルックアップ テーブル、または次のような他のメタデータ オブジェクトによって指示される可能性があります。
ds_lookup <- tibble::tribble(
~x, ~desired_column,
1L, "a",
2L, "b",
3L, "c"
)
この列切り替えの質問は以前にもあったと思いますが、該当するものは見つかりませんでした。
私はtidyverseソリューションを好みます (私のチームが最も快適に使用できるのは b/c です) が、私はどのツールにもオープンです。applyとkimisc::vswitchを組み合わせて使用する方法がわかりませんでした。