根据命名向量替换列表列中的值
replace values in list-column based on named vector
给定以下 df
(或 tibble
)和 list-column
:
set.seed(1)
df <- data.frame(a = sample(letters, 7),
b = sample(letters, 7),
c = c("yes", "no", "yes", "no", "yes", "no", "no"),
list_col = I(list(c(1, 2, 3), "hjhj", c(1, 4), "kkjkj", c(3, 4), "jkj", c(1, 2))))
df
# a b c list_col
# 1 y r yes 1, 2, 3
# 2 d s no hjhj
# 3 g a yes 1, 4
# 4 a u no kkjkj
# 5 b w yes 3, 4
# 6 k j no jkj
# 7 n n no 1, 2
str(df)
# 'data.frame': 7 obs. of 4 variables:
# $ a : chr "y" "d" "g" "a" ...
# $ b : chr "r" "s" "a" "u" ...
# $ c : chr "yes" "no" "yes" "no" ...
# $ list_col:List of 7
# ..$ : num 1 2 3
# ..$ : chr "hjhj"
# ..$ : num 1 4
# ..$ : chr "kkjkj"
# ..$ : num 3 4
# ..$ : chr "jkj"
# ..$ : num 1 2
# ..- attr(*, "class")= chr "AsIs"
我想将 list_col
值替换为查找 table 中相应值的名称,但仅适用于第 c == "yes"
列的行
#named lookup
c_yes_column_look_up <- c("number1" = 1,
"number2" = 2,
"number3" = 3,
"number4" = 4)
所以我的最终 df
看起来像:
df_final
# a b c list_col
# 1 y r yes number1,....
# 2 d s no hjhj
# 3 g a yes number1,....
# 4 a u no kkjkj
# 5 b w yes number3,....
# 6 k j no jkj
# 7 n n no 1, 2
str(df_final)
# 'data.frame': 7 obs. of 4 variables:
# $ a : chr "y" "d" "g" "a" ...
# $ b : chr "r" "s" "a" "u" ...
# $ c : chr "yes" "no" "yes" "no" ...
# $ list_col:List of 7
# ..$ : chr "number1" "number2" "number3"
# ..$ : chr "hjhj"
# ..$ : chr "number1" "number4"
# ..$ : chr "kkjkj"
# ..$ : chr "number3" "number4"
# ..$ : chr "jkj"
# ..$ : num 1 2
# ..- attr(*, "class")= chr "AsIs"
我在想一些与 类似的事情,但不太明白:
library(tidyverse)
df %>%
#rowwise() %>%
mutate(list_col = case_when(c == "yes" & list_col %in% c_yes_column_look_up ~ names(list_col[list_col %in% c_yes_column_look_up]),
TRUE ~ list_col))
也对其他方法持开放态度,谢谢
命名向量应该反转。我们可以使用 rowwise
或 map2
(但 map2
可能更有效)。遍历 'list_col' 和 'c' 的元素,创建一个条件,其中 'c' 值为 'yes',然后使用向量值进行名称匹配(在反向名称向量上) , coalesce
(如果有NA)到return原始向量
library(dplyr)
library(purrr)
df1 <- df %>%
mutate(list_col = map2(list_col, c, ~ if(.y %in% 'yes')
unname(coalesce(setNames(names(c_yes_column_look_up),
c_yes_column_look_up)[.x], as.character(.x))) else .x))
-输出
> str(df1)
'data.frame': 7 obs. of 4 variables:
$ a : chr "y" "d" "g" "a" ...
$ b : chr "r" "s" "a" "u" ...
$ c : chr "yes" "no" "yes" "no" ...
$ list_col:List of 7
..$ : chr "number1" "number2" "number3"
..$ : chr "hjhj"
..$ : chr "number1" "number4"
..$ : chr "kkjkj"
..$ : chr "number3" "number4"
..$ : chr "jkj"
..$ : num 1 2
给定以下 df
(或 tibble
)和 list-column
:
set.seed(1)
df <- data.frame(a = sample(letters, 7),
b = sample(letters, 7),
c = c("yes", "no", "yes", "no", "yes", "no", "no"),
list_col = I(list(c(1, 2, 3), "hjhj", c(1, 4), "kkjkj", c(3, 4), "jkj", c(1, 2))))
df
# a b c list_col
# 1 y r yes 1, 2, 3
# 2 d s no hjhj
# 3 g a yes 1, 4
# 4 a u no kkjkj
# 5 b w yes 3, 4
# 6 k j no jkj
# 7 n n no 1, 2
str(df)
# 'data.frame': 7 obs. of 4 variables:
# $ a : chr "y" "d" "g" "a" ...
# $ b : chr "r" "s" "a" "u" ...
# $ c : chr "yes" "no" "yes" "no" ...
# $ list_col:List of 7
# ..$ : num 1 2 3
# ..$ : chr "hjhj"
# ..$ : num 1 4
# ..$ : chr "kkjkj"
# ..$ : num 3 4
# ..$ : chr "jkj"
# ..$ : num 1 2
# ..- attr(*, "class")= chr "AsIs"
我想将 list_col
值替换为查找 table 中相应值的名称,但仅适用于第 c == "yes"
#named lookup
c_yes_column_look_up <- c("number1" = 1,
"number2" = 2,
"number3" = 3,
"number4" = 4)
所以我的最终 df
看起来像:
df_final
# a b c list_col
# 1 y r yes number1,....
# 2 d s no hjhj
# 3 g a yes number1,....
# 4 a u no kkjkj
# 5 b w yes number3,....
# 6 k j no jkj
# 7 n n no 1, 2
str(df_final)
# 'data.frame': 7 obs. of 4 variables:
# $ a : chr "y" "d" "g" "a" ...
# $ b : chr "r" "s" "a" "u" ...
# $ c : chr "yes" "no" "yes" "no" ...
# $ list_col:List of 7
# ..$ : chr "number1" "number2" "number3"
# ..$ : chr "hjhj"
# ..$ : chr "number1" "number4"
# ..$ : chr "kkjkj"
# ..$ : chr "number3" "number4"
# ..$ : chr "jkj"
# ..$ : num 1 2
# ..- attr(*, "class")= chr "AsIs"
我在想一些与
library(tidyverse)
df %>%
#rowwise() %>%
mutate(list_col = case_when(c == "yes" & list_col %in% c_yes_column_look_up ~ names(list_col[list_col %in% c_yes_column_look_up]),
TRUE ~ list_col))
也对其他方法持开放态度,谢谢
命名向量应该反转。我们可以使用 rowwise
或 map2
(但 map2
可能更有效)。遍历 'list_col' 和 'c' 的元素,创建一个条件,其中 'c' 值为 'yes',然后使用向量值进行名称匹配(在反向名称向量上) , coalesce
(如果有NA)到return原始向量
library(dplyr)
library(purrr)
df1 <- df %>%
mutate(list_col = map2(list_col, c, ~ if(.y %in% 'yes')
unname(coalesce(setNames(names(c_yes_column_look_up),
c_yes_column_look_up)[.x], as.character(.x))) else .x))
-输出
> str(df1)
'data.frame': 7 obs. of 4 variables:
$ a : chr "y" "d" "g" "a" ...
$ b : chr "r" "s" "a" "u" ...
$ c : chr "yes" "no" "yes" "no" ...
$ list_col:List of 7
..$ : chr "number1" "number2" "number3"
..$ : chr "hjhj"
..$ : chr "number1" "number4"
..$ : chr "kkjkj"
..$ : chr "number3" "number4"
..$ : chr "jkj"
..$ : num 1 2