使用dplyr根据数据框列值新增列的无循环实现方法
用dplyr实现无循环的数值映射
嗨,这个需求用dplyr处理超省心的,完全不用写循环!我给你两种常用的简洁实现方式,都是向量化操作,效率和可读性拉满:
方法1:用case_when明确映射
case_when是dplyr里专门处理多条件分支的函数,刚好适合这种一一对应的映射场景,逻辑非常直观:
library(dplyr) # 先构造你的示例数据框 df <- tibble(c_touch = c(0, 1, 3, 2, 3, 4, 5)) # 新增c_duration列 df <- df %>% mutate(c_duration = case_when( c_touch == 0 ~ 2, c_touch == 1 ~ 5, c_touch == 2 ~ 10, c_touch == 3 ~ 15, c_touch == 4 ~ 20, c_touch == 5 ~ 30 ))
运行后你的数据框就会变成:
# A tibble: 7 × 2 c_touch c_duration <dbl> <dbl> 1 0 2 2 1 5 3 3 15 4 2 10 5 3 15 6 4 20 7 5 30
方法2:用命名向量批量匹配
如果你的映射关系以后可能需要调整,用命名向量会更方便维护——只需要修改向量就行,不用动mutate里的代码:
# 先定义映射规则的命名向量 touch_to_duration <- c( "0" = 2, "1" = 5, "2" = 10, "3" = 15, "4" = 20, "5" = 30 ) # 用pull + as.character匹配(因为命名向量的名字是字符型,要和c_touch的类型对应) df <- df %>% mutate(c_duration = touch_to_duration[as.character(c_touch)])
这种方法的效果和第一种完全一样,而且当映射项变多的时候,代码会更简洁。
两种方法都是向量化操作,比循环效率高得多,尤其是处理大数据集的时候优势明显~
内容的提问来源于stack exchange,提问作者user438383
相关产品推荐
相关产品推荐

