gpt4 book ai didi

r - 使用条件变异分配多个值

转载 作者:行者123 更新时间:2023-12-04 10:34:21 24 4
gpt4 key购买 nike

能否使用单个条件 mutate 调用为多个变量赋值?

例如,在下面的示例中,当 cat == "a" 时,我想将值“1”分配给列“foo”,以及值“three”到列“栏”。同样,当 cat == "b" 时,分配 "2"和 "four"。

下面实现了这一点,但要求对每个变量重复调用 case_when

require(tidyverse)
df <- tibble(cat = c("a", "b", "a", "a", "c"))
df %>%
mutate(foo = case_when(cat == "a" ~ 1,
cat == "b" ~ 2,
TRUE ~ NA_real_)) %>%
mutate(bar = case_when(cat == "a" ~ "three",
cat == "b" ~ "four",
TRUE ~ NA_character_))

我认为创建一个列表列可能会有用,类似于

df %>%
mutate(case_when(cat == "a" ~ list("foo" = 1, "bar" = "three"),
cat == "b" ~ list("foo" = 2, "bar" = "four"),
TRUE ~ NA_real_))

但是 case_when 只接受 RHS 的单个值。

一个解决方案(例如 here )是创建一个“引用”数据框,然后加入它,例如

require(tidyverse)    
ref <- tibble(cat = c("a", "b"), foo = c(1, 2), bar = c("three", "four"))
df %>% left_join(ref)

然而,当“条件”不是绝对的时,这将不起作用,例如x > 2

有什么好的方法可以推荐吗?谢谢

最佳答案

您所描述的非常接近 data.table 功能,您可以在其中提供要根据特定条件更新(通过引用,即不复制)的列和值的列表:

library(data.table)
dt <- as.data.table(df) # or use setDT(df)
dt[cat == "a", `:=`(foo = 1, bar = "three")]
dt[cat == "b", `:=`(foo = 2, bar = "four")]

关于r - 使用条件变异分配多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50245642/

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