【发布时间】:2023-02-07 17:58:12
【问题描述】:
我有一个包含许多列的数据集,通过每个行值组合,为另一列中的新值确定一组规则。不同的组合是多种多样的,并不是每个规则都包含所有列。此外,某些列的有机体名称往往很长。因此,我目前使用的方法(case_when)变得非常混乱,并且审查这些规则变得非常乏味。
我想知道是否有更好的方法来做到这一点,它更干净、更容易审查?我运行它的数据集有超过 70.000 个观察值,因此下面是一个可以使用的虚拟数据集。
col1 col2 col3 col4 col5 col6
1 A 43 string1 AA verylongnamehere
2 B 22 string2 BB anotherlongname
3 C 15 string3 CC yetanotherlongname
4 D 100 string4 DD hereisanotherlongname
5 E 60 string5 EE thisisthelastlongname
test <- data.frame(
col1 = c(1,2,3,4,5),
col2 = c("A","B","C","D","E"),
col3 = c(43,22,15,100,60),
col4 = c("string1","string2","string3","string4","string5"),
col5 = c("AA","BB","CC","DD","EE"),
col6 = c("verylongnamehere", "anotherlongname","yetanotherlongname","hereisanotherlongname","thisisthelastlongname")
)
以下代码是我使用的规则和代码的示例:
library(dplyr)
test2 <- test %>%
mutate(new_col = case_when(
col1 == 1 & col2 == "A" & col6 == "verylongnamehere" ~ "result1",
col3 >= 60 & col5 == "DD" ~ "result2",
col1 %in% c(2,3,4) &
col2 %in% c("B","D") &
col5 %in% c("BB","CC","DD") &
col6 %in% c("anotherlongname","yetanotherlongname") ~ "result3",
TRUE ~ "result4"
))
【问题讨论】:
-
这通常很棘手,解决方案取决于具体情况。如果有少数条件,我会尝试为每个条件设计一个有意义的名称,根据该名称创建一个
TRUE/NA列,然后创建一个新列coalesce()。如果有很多条件,我可能更愿意将数据放在长格式中。几个问题:真实数据有多大?有几个条件?您是否预计必须定期更改规则或条件数量?一行是否可以满足两个条件(它们似乎并不相互排斥),如果可以,其意图是什么?您是否需要使用dplyr而不是data.table? -
case_when可能是你最好的选择,如果有很多条件,比如你的例子,它通常和你展示的一样不可约
标签: r