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

R语言:如何用if/else语句生成仅保留指定城市数据的新列?

问题描述

我有如下R数据集:

mydat <- data.frame(
  Date=c("Jan 1, 2022", "Jan 1, 2022", "Jan 2, 2022","Jan 4, 2022", "Jan 4, 2022", "Jan 6, 2022"),
  City=c("Worcester","Boston","Ashburn","Brockton","Cambridge", "Springfield"),
  Users=c(3,34,1,2,1,2))

数据集结构如下:

DateCityUsers
Jan 1, 2022Worcester3
Jan 1, 2022Boston34
Jan 2, 2022Ashburn1
Jan 4, 2022Brockton2
Jan 4, 2022Cambridge1
Jan 6, 2022Springfield2

我想创建新列boston_users,仅保留City为"Boston"对应的Users值,其余行留空。尝试了以下代码:

mydat$boston_users <- if (dat$City == "Boston") mydat$Users else " "

但执行后新列全部为空:

DateCityUsersboston_users
Jan 1, 2022Worcester3
Jan 1, 2022Boston34
Jan 2, 2022Ashburn1
Jan 4, 2022Brockton2
Jan 4, 2022Cambridge1
Jan 6, 2022Springfield2

测试恒成立条件的代码能正常填充所有Users值:

mydat$hello_users <- if ("hello" == "hello") mydat$Users else " "

结果如下:

DateCityUsershello_usersboston_users
Jan 1, 2022Worcester33
Jan 1, 2022Boston3434
Jan 2, 2022Ashburn11
Jan 4, 2022Brockton22
Jan 4, 2022Cambridge11
Jan 6, 2022Springfield22

需要找出问题所在并解决。


问题原因与解决方法

错误原因

  1. 对象名拼写错误:代码里写的是dat$City,但你的数据集实际命名为mydat,应该改为mydat$City。
  2. if()的局限性:基础R中的if()只能处理长度为1的逻辑值,当传入长度大于1的逻辑向量(比如mydat$City == "Boston"会生成6个元素的向量),它只会取第一个元素判断。这里第一行的City是Worcester,对应逻辑值为FALSE,所以整个条件判定为假,所有行都被赋值为空字符串。

正确实现方式

方式1:使用ifelse()函数(向量化条件判断)

ifelse()是专门处理向量的条件判断函数,会逐个元素检查条件并赋值:

mydat$boston_users <- ifelse(mydat$City == "Boston", mydat$Users, "")

执行后得到预期结果:

DateCityUsersboston_users
Jan 1, 2022Worcester3
Jan 1, 2022Boston3434
Jan 2, 2022Ashburn1
Jan 4, 2022Brockton2
Jan 4, 2022Cambridge1
Jan 6, 2022Springfield2

方式2:索引赋值

先初始化新列为空字符串,再给符合条件的行赋值,逻辑更直观:

mydat$boston_users <- ""
mydat$boston_users[mydat$City == "Boston"] <- mydat$Users[mydat$City == "Boston"]

内容的提问来源于stack exchange,提问作者Julie B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:20:43