如何在ifelse语句中创建并分配多个新的数据框列?
嘿,我明白你现在的困惑啦——想用ifelse一次性生成多个新变量,但发现没法在分支里塞多个赋值语句是吧?其实你的思路没问题,但ifelse的特性决定了它不能这么用,我来给你捋捋正确的做法~
首先先修正你的初始数据框定义,原来的写法列名默认是X1,得改成H才能匹配你代码里的$H:
# 修正初始数据框,给列命名为H my_df <- data.frame(H = c("0600", "0602", "0603"))
方法1:Base R逻辑索引(最直观的原生写法)
先创建新数据框并复制原数据,再逐个给新变量按条件赋值,逻辑清晰不容易出错:
# 创建新数据框d,复制原数据内容 d <- my_df # 先初始化所有新变量(可以设默认值,比如NA) d$D <- NA_integer_ d$c <- NA_character_ d$E <- NA_real_ # 假设你需要第三个变量E # 针对每个条件给变量赋值 # 当H为"0600"时 d$D[d$H == "0600"] <- 1 + 1 d$c[d$H == "0600"] <- "0600" d$E[d$H == "0600"] <- 0.5 # 当H为"0602"时 d$D[d$H == "0602"] <- 2 + 1 d$c[d$H == "0602"] <- "0602" d$E[d$H == "0602"] <- 1.0 # 当H为"0603"时 d$D[d$H == "0603"] <- 3 + 1 d$c[d$H == "0603"] <- "0603" d$E[d$H == "0603"] <- 1.5
方法2:dplyr的case_when(简洁的tidyverse风格)
如果习惯用tidyverse工具,case_when能让多条件多变量的赋值更紧凑,可读性拉满:
library(dplyr) d <- my_df %>% mutate( # 给变量D赋值 D = case_when( H == "0600" ~ 1 + 1, H == "0602" ~ 2 + 1, H == "0603" ~ 3 + 1, TRUE ~ NA_integer_ # 其他情况的默认值 ), # 给变量c赋值 c = case_when( H == "0600" ~ "0600", H == "0602" ~ "0602", H == "0603" ~ "0603", TRUE ~ NA_character_ ), # 给变量E赋值 E = case_when( H == "0600" ~ 0.5, H == "0602" ~ 1.0, H == "0603" ~ 1.5, TRUE ~ NA_real_ ) )
为什么你原来的写法行不通?
你之前写的{d$D <- 1+1 & d$c <- "0600"}有两个核心问题:
&是逻辑运算符,它会先计算两边赋值语句的返回值(赋值语句的返回值是被赋的内容),然后做逻辑判断——比如1+1是数字2,"0600"是字符串,这样的逻辑判断会直接报错,完全不是执行两个赋值的意思。ifelse是向量化函数,它的返回值必须是一个向量,不能在分支里直接修改其他变量,只能返回对应位置的单个值。
如果一定要用ifelse(不推荐,条件多了嵌套会非常难读),那只能对每个变量单独调用ifelse:
d <- my_df d$D <- ifelse(d$H == "0600", 1+1, ifelse(d$H == "0602", 2+1, 3+1)) d$c <- ifelse(d$H == "0600", "0600", ifelse(d$H == "0602", "0602", "0603")) d$E <- ifelse(d$H == "0600", 0.5, ifelse(d$H == "0602", 1.0, 1.5))
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

