【发布时间】:2021-10-04 11:03:48
【问题描述】:
给定以下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 值,但仅限于列 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"
我在想一些类似this 的东西,但不能完全弄清楚:
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))
也欢迎其他方法,谢谢
【问题讨论】: