如何使用dplyr对数据框多列参数做单调性判断并生成新列
正确实现代码
首先使用rowwise()按行分组,搭配c_across()提取每行的参数列值为向量,再做匹配判断:
library(dplyr) df2 <- df1 %>% rowwise() %>% mutate( monotonic = dplyr::case_when( identical(sort(unique(c_across(ends_with("param")))), "down") ~ "down", identical(sort(unique(c_across(ends_with("param")))), "unchanged") ~ "static", identical(sort(unique(c_across(ends_with("param")))), "up") ~ "up", identical(sort(unique(c_across(ends_with("param")))), c("down", "unchanged")) ~ "down", identical(sort(unique(c_across(ends_with("param")))), c("down", "up")) ~ "non", identical(sort(unique(c_across(ends_with("param")))), c("unchanged", "up")) ~ "up", identical(sort(unique(c_across(ends_with("param")))), c("down", "unchanged", "up")) ~ "non", TRUE ~ "error" ) ) %>% ungroup()
关键修改说明
rowwise()将数据框按行分组,后续mutate操作会逐行执行c_across()替代across(),作用是将当前行选中的多列值拼接为向量,满足unique、sort的输入要求- 用
identical()做全等比较,避免不同长度向量比较时的循环匹配问题 - 运算结束后调用
ungroup()取消行分组,避免后续数据操作受行分组影响
运行后得到的monotonic列结果如下:
| name | monotonic |
|---|---|
| ann | down |
| bob | non |
| cam | up |
| dan | static |
| eve | non |
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

