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))
数据集结构如下:
| Date | City | Users |
|---|---|---|
| Jan 1, 2022 | Worcester | 3 |
| Jan 1, 2022 | Boston | 34 |
| Jan 2, 2022 | Ashburn | 1 |
| Jan 4, 2022 | Brockton | 2 |
| Jan 4, 2022 | Cambridge | 1 |
| Jan 6, 2022 | Springfield | 2 |
我想创建新列boston_users,仅保留City为"Boston"对应的Users值,其余行留空。尝试了以下代码:
mydat$boston_users <- if (dat$City == "Boston") mydat$Users else " "
但执行后新列全部为空:
| Date | City | Users | boston_users |
|---|---|---|---|
| Jan 1, 2022 | Worcester | 3 | |
| Jan 1, 2022 | Boston | 34 | |
| Jan 2, 2022 | Ashburn | 1 | |
| Jan 4, 2022 | Brockton | 2 | |
| Jan 4, 2022 | Cambridge | 1 | |
| Jan 6, 2022 | Springfield | 2 |
测试恒成立条件的代码能正常填充所有Users值:
mydat$hello_users <- if ("hello" == "hello") mydat$Users else " "
结果如下:
| Date | City | Users | hello_users | boston_users |
|---|---|---|---|---|
| Jan 1, 2022 | Worcester | 3 | 3 | |
| Jan 1, 2022 | Boston | 34 | 34 | |
| Jan 2, 2022 | Ashburn | 1 | 1 | |
| Jan 4, 2022 | Brockton | 2 | 2 | |
| Jan 4, 2022 | Cambridge | 1 | 1 | |
| Jan 6, 2022 | Springfield | 2 | 2 |
需要找出问题所在并解决。
问题原因与解决方法
错误原因
- 对象名拼写错误:代码里写的是
dat$City,但你的数据集实际命名为mydat,应该改为mydat$City。 if()的局限性:基础R中的if()只能处理长度为1的逻辑值,当传入长度大于1的逻辑向量(比如mydat$City == "Boston"会生成6个元素的向量),它只会取第一个元素判断。这里第一行的City是Worcester,对应逻辑值为FALSE,所以整个条件判定为假,所有行都被赋值为空字符串。
正确实现方式
方式1:使用ifelse()函数(向量化条件判断)
ifelse()是专门处理向量的条件判断函数,会逐个元素检查条件并赋值:
mydat$boston_users <- ifelse(mydat$City == "Boston", mydat$Users, "")
执行后得到预期结果:
| Date | City | Users | boston_users |
|---|---|---|---|
| Jan 1, 2022 | Worcester | 3 | |
| Jan 1, 2022 | Boston | 34 | 34 |
| Jan 2, 2022 | Ashburn | 1 | |
| Jan 4, 2022 | Brockton | 2 | |
| Jan 4, 2022 | Cambridge | 1 | |
| Jan 6, 2022 | Springfield | 2 |
方式2:索引赋值
先初始化新列为空字符串,再给符合条件的行赋值,逻辑更直观:
mydat$boston_users <- "" mydat$boston_users[mydat$City == "Boston"] <- mydat$Users[mydat$City == "Boston"]
内容的提问来源于stack exchange,提问作者Julie B
相关产品推荐
相关产品推荐

