首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据另一列的值更改一列的值

根据另一列的值更改一列的值
EN

Stack Overflow用户
提问于 2021-02-04 23:02:34
回答 2查看 58关注 0票数 0

我想知道我能否根据列状态的值更改列CVE的值。

我有50个不同的状态,我想根据列状态的值在列CVE中设置一个值。

示例

代码语言:javascript
复制
year   state    CVE
1980   TX        3
1986   PEN       3
1987   CAL       3
2000   TX        3 

我想要的是,如果状态== "TX“,那么将列CVE的值更改为"45”,以及其他状态的相同逻辑。

我试过用这个:

代码语言:javascript
复制
setDT(df)[state == "TX" , CVE:="45" ]
setDT(df)[state == "CAL" , CVE:="50" ]
setDT(df)[state == "PEN" , CVE:="56" ]

但我不知道如何为不同的状态编写一个命令并设置CVE。我想知道是否有办法避免重复相同的命令50次。

EN

回答 2

Stack Overflow用户

发布于 2021-02-04 23:04:24

使用key/val数据集和join可以更容易地完成,这样可以快速有效地完成任务。

代码语言:javascript
复制
library(data.table)
keydat <- data.table(state = c("TX", "CAL", "PEN"), CVE_GEO = c("45", "50", "56"))
setDT(df)[keydat,  CVE := i.CVE_GEO, on = .(state)]

-output

代码语言:javascript
复制
df
#  year state CVE
#1: 1980    TX  45
#2: 1986   PEN  56
#3: 1987   CAL  50
#4: 2000    TX  45

注意:这里我们假设原始数据集中的CVE列与'keydat‘'CVE_GEO’(即character类)的类型相同

数据

代码语言:javascript
复制
df <- structure(list(year = c(1980L, 1986L, 1987L, 2000L), state = c("TX", 
"PEN", "CAL", "TX"), CVE = c("3", "3", "3", "3")), row.names = c(NA, 
-4L), class = "data.frame")
票数 1
EN

Stack Overflow用户

发布于 2021-02-05 01:02:36

看来你所需要的只是一个命名的向量。你可以用它来查找。下面是一个示例:

代码语言:javascript
复制
# Create sample data
df <- read.table(header = TRUE, text = '
year   state    CVE
1980   TX        3
1986   PEN       3
1987   CAL       3
2000   TX        3 
')

# Create lookup named vector
vct <- c(TX = 45, PEN = 54, CAL = 29)

# Apply vector to CVE column
df$CVE <- vct[df$state]

# View results
df
# year state CVE
# 1 1980    TX  45
# 2 1986   PEN  54
# 3 1987   CAL  29
# 4 2000    TX  45
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66055160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档