r - 使用 purrr map2 将嵌套数据中的 if then 构造转换为 case_when
问题描述
这是我的数据:
vec1 <- c("A", "B")
vec2 <- c("A", "B", "C")
df1 <- structure(list(A = c("X", "Y"), data = list(structure(list(B = c(4L, 9L)), .Names = "B", row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame")), structure(list(B = c(5L, 2L, 8L, 2L)), .Names = "B", row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))), C = list(c("A", "B"), c("A", "B", "C"))), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -2L), .Names = c("A", "data", "C"))
这是我的代码:
df2 <- df1 %>% mutate(data = map2(data, C, ~ if(identical(.y, vec1)) filter(.x, B < 5) else filter(.x, B > 4)))
为了轻松扩展条件的数量,我想将上面代码中的 if else 构造转换为 case_when 构造。我怎样才能做到这一点?
解决方案
为什么需要一个case when
?
尝试:
m=df1%>%
mutate(filt=map2(data,match(C,list(vec1,vec2)),
~filter_(.x,c("B<=4","B>4")[.y])))
m
# A tibble: 2 x 4
A data C filt
<chr> <list> <list> <list>
1 X <tibble [2 x 1]> <chr [2]> <tibble [1 x 1]>
2 Y <tibble [4 x 1]> <chr [3]> <tibble [2 x 1]>
如果您希望它与您df2
刚刚替换的data
列相同:
df1%>%
mutate(data=map2(data,match(C,list(vec1,vec2)),
~filter_(.x,c("B<=4","B>4")[.y])))%>%
identical(df2)
[1] TRUE
如果条件太多,你可以在外面创建它们。条件的顺序确实很重要:顺序或条件应与向量的顺序相匹配,例如:
conditions=c("B>4","B<=4")
ll=list(vec2,vec1)
df1%>%
mutate(data=map2(data,match(C,ll),
~filter_(.x,conditions[.y])))%>%
identical(df2)
[1] TRUE
推荐阅读
- python-3.x - aiomysql 选择数据问题:未更新
- c - 为什么使用c不能在函数外访问函数中的内存空间malloc
- java - Spring boot 没有从 Maven 项目中的 soap wsdl 生成 java 类。这是我的 pom.xml
- windows - 如何在 Rust 中创建一个继承自 C++ 中定义的 COM 对象的 COM 对象?
- javascript - 同级组件不接收发出的更改
- algorithm - 代表顶点循环覆盖
- reactjs - 如何通过 React 动态显示数据列表?
- javascript - Redux Store 向原始选择添加重复内容和导航产生空数组
- c# - 如何在 C# 中添加永远不会用于表达式树的参数?
- java - 如何在sqlite db中保存特定列的历史记录