You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:23:56