【发布时间】:2019-08-12 02:15:13
【问题描述】:
我有一个如下的 tibble 数据框:
data = tibble(X = c("a", "b", "c", "d","c"),
Y = c("a1", "b1", "c1", "d1","c1"),
Z = c("a2", "b2", "c2", "d2","c2"),
all = list(c("a"), c("b"), c("c", "c1"), c("d", "d2"), c("c", "b2")))
我想为每一行创建一个新列“结果”:
- 如果 "Y" 值在 "all" => 结果等于 Y 值
- 如果 "Z" 值在 "all" => 结果等于 Z 值
- 否则结果等于“无”
我已经使用 dplyr 语法尝试了以下代码。
data %>%
mutate(result = case_when(Y %in% all ~ Y,
Z %in% all ~ Z,
TRUE ~ "none"))
它没有按预期工作并返回:
# A tibble: 4 x 5
X Y Z all result
<chr> <chr> <chr> <list> <chr>
1 a a1 a2 <chr [2]> none
2 b b1 b2 <chr [1]> none
3 c c1 c2 <chr [2]> none
4 d d1 d2 <chr [2]> none
当我想获得时:
# A tibble: 4 x 5
X Y Z all result
<chr> <chr> <chr> <list> <chr>
1 a a1 a2 <chr [2]> none
2 b b1 b2 <chr [1]> none
3 c c1 c2 <chr [2]> c1
4 d d1 d2 <chr [2]> d2
编辑
一个问题是取消列列表中的值,如Ronak Shah 所述。但即使使用此解决方案,行为就像处理列列表一样会考虑列的所有值,而不仅仅是一行的值。
这是我通过建议的解决方案和编辑后的数据获得的:
data %>%
mutate(result = case_when(Y %in% flatten_chr(all) ~ Y,
Z %in% flatten_chr(all) ~ Z,
TRUE ~ "none"))
# A tibble: 5 x 5
X Y Z all result
<chr> <chr> <chr> <list> <chr>
1 a a1 a2 <chr [1]> none
2 b b1 b2 <chr [1]> b2
3 c c1 c2 <chr [2]> c1
4 d d1 d2 <chr [2]> d2
5 c c1 c2 <chr [2]> c1
什么时候应该返回:
# A tibble: 5 x 5
X Y Z all result
<chr> <chr> <chr> <list> <chr>
1 a a1 a2 <chr [1]> none
2 b b1 b2 <chr [1]> none
3 c c1 c2 <chr [2]> c1
4 d d1 d2 <chr [2]> d2
5 c c1 c2 <chr [2]> none
【问题讨论】:
-
data %>% rowwise() %>% mutate(result = case_when(Y %in% unlist(all) ~ Y, Z %in% unlist(all) ~ Z,TRUE ~ "none"))应该做你想做的事