gpt4 book ai didi

r - 在 dplyr 1.0.0 中使用 case_when 跨多个列应用条件

转载 作者:行者123 更新时间:2023-12-04 02:25:01 24 4
gpt4 key购买 nike

我想不出来这个。假设我想创建一个条件变量,每当数据框中的任何行具有包含目标的列时都会返回一次命中。

总是更容易用例子来说明。这是玩具数据

set.seed(10)
d <- data.frame(a = sample(x = letters[1:2],
size = 10,
replace = T),
b = sample(x = letters[1:2],
size = 10,
replace = T),
c = sample(x = letters[1:2],
size = 10,
replace = T))

d

# output
# a b c
# 1 a a a
# 2 a b b
# 3 b a b
# 4 b a a
# 5 b b b
# 6 a a a
# 7 b b a
# 8 b b b
# 9 a b b
# 10 a a a

现在我想创建一个列,当任何行中存在 a 时返回 anyA,并在存在时返回 noA不存在 a。输出看起来像这样

#    a b c anyA
# 1 a a a anyA
# 2 a b b anyA
# 3 b a b anyA
# 4 b a a anyA
# 5 b b b noA
# 6 a a a anyA
# 7 b b a anyA
# 8 b b b noA
# 9 a b b anyA
# 10 a a a anyA

我尝试了以下代码,使用、mutate、rowwise、c_across 和 case_when

d %>%
rowwise() %>%
mutate(anyA = case_when(c_across(cols = everything(),
any(.x == "a") ~ "anyA",
TRUE ~ "noA")))

但它没有用。我真的不知道我在做什么。有什么想法吗?

附言我特别不想命名 case_when 中的所有列。在我的真实示例中,有很多列可以应用条件。

最佳答案

您可以使用 rowwisec_across 作为 -

library(dplyr)

d %>%
rowwise() %>%
mutate(anyA = case_when(any(c_across() == "a") ~ "anyA",
TRUE ~ "noA")) %>%
ungroup

# a b c anyA
# <chr> <chr> <chr> <chr>
# 1 a a a anyA
# 2 a b b anyA
# 3 b a b anyA
# 4 b a a anyA
# 5 b b b noA
# 6 a a a anyA
# 7 b b a anyA
# 8 b b b noA
# 9 a b b anyA
#10 a a a anyA

c_across() 默认有 cols = everything()


或者没有rowwise,使用if_any应该会更快。

d %>% mutate(anyA = if_else(if_any(.fns = ~. == 'a'), "anyA", "noA"))

关于r - 在 dplyr 1.0.0 中使用 case_when 跨多个列应用条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68324559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com