如何解决在整齐的R grep中使用mutate基于多个条件添加列
我正在努力在添加的列中对宽数据帧进行分类,但是基于多个列的阈值(> 0)。 SO上的先前示例要求列的完整名称以及带有>和==的if else()语句。但是我需要能够使用grep()或contains()来基于通用字符串隔离列。
输入数据框:
library(tidyverse)
df <- data.frame(
"ID" = c("asdf","vfdkun","seifu","seijd","qweri"),"elephant_zoo" = c(1,1,2,0),#Should not be useful there
"rhino_zoo" = c(1,3,#Should not be useful there
"hippo_zoo" = c(1,"elephant_wild_A" = c(0,3),"rhino_wild_A" = c(0,4,1),"elephant_wild_B" = c(0,"rhino_wild_C" = c(0,5,7),"hippo_wild_B" = c(0,0)) %>%
column_to_rownames(var = "ID")
df
实际上,它具有更多的列和行!
所需的输出数据框已对行(ZOO
和WILD
)进行了分类,并汇总了这些CLASSIFICATION
。
df_goal <- data.frame(
"ID" = c("asdf",2),"rhino_wild_A" = c(1,"rhino_wild_C" = c(6,0)) %>%
column_to_rownames(var = "ID") %>%
add_column(ZOO = c("zoo","zoo","")) %>%
add_column(WILD = c("","","wild","wild")) %>%
add_column(CLASSIFICATION = c("zoo only","zoo only","both","wild only"))
df_goal
我希望使用mutate()
和case_when()
的组合,但是我无法正确选择多个列。
尝试示例:
# using an if else statement
df %>%
mutate(ZOO = ifelse(select(contains("zoo")) > 0,"F"))
# using mutate and case_when
df %>%
mutate(ZOO = case_when(
select(contains("zoo")) > 0 ~ "zoo",TRUE ~ ""))
我的实际数据框还有更多类别,因此可以将其分解为ZOO vs WILD,然后关注已编译列。
解决方法
您可以尝试使用reduce
包中的purrr
。可以使用中间函数any_cols
来使代码更清晰,并与across
一起使用:
library(tidyverse)
any_cols <- function(df) reduce(df,`|`)
df %>%
mutate(ZOO = ifelse(any_cols(across(contains("zoo"),~`>`(.,0))),"zoo","F"))
elephant_zoo rhino_zoo hippo_zoo elephant_wild_A rhino_wild_A elephant_wild_B rhino_wild_C hippo_wild_B ZOO
1 1 1 1 0 0 0 0 0 zoo
2 1 2 1 0 0 0 0 0 zoo
3 1 3 0 1 4 0 1 0 zoo
4 2 1 0 1 3 0 5 0 zoo
5 0 0 0 3 1 0 7 0 F
df %>%
mutate(ZOO =
case_when(any_cols(across(contains("zoo"),0))) ~ "zoo",TRUE ~ "F"))
elephant_zoo rhino_zoo hippo_zoo elephant_wild_A rhino_wild_A elephant_wild_B rhino_wild_C hippo_wild_B ZOO
1 1 1 1 0 0 0 0 0 zoo
2 1 2 1 0 0 0 0 0 zoo
3 1 3 0 1 4 0 1 0 zoo
4 2 1 0 1 3 0 5 0 zoo
5 0 0 0 3 1 0 7 0 F
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。