【问题标题】:Change the value of one column based on the value of other column根据另一列的值更改一列的值
【发布时间】:2021-02-04 23:02:34
【问题描述】:

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

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

例子

year   state    CVE
1980   TX        3
1986   PEN       3
1987   CAL       3
2000   TX        3 

我希望如果 state == "TX" 然后将 CVE 列的值更改为 "45",其他状态的逻辑相同。

我试过这个:

setDT(df)[state == "TX" , CVE:="45" ]
setDT(df)[state == "CAL" , CVE:="50" ]
setDT(df)[state == "PEN" , CVE:="56" ]

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

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    使用 key/val 数据集和快速高效的连接会更容易

    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)]
    

    -输出

    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

    数据

    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")
    

    【讨论】:

      【解决方案2】:

      似乎您只需要一个命名向量。您可以将其用作查找。这是一个例子:

      # 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
      
      

      【讨论】:

        猜你喜欢
        • 2021-09-05
        • 1970-01-01
        • 2016-01-23
        • 1970-01-01
        • 2022-12-16
        • 1970-01-01
        • 2018-04-15
        • 2019-04-04
        • 1970-01-01
        相关资源
        最近更新 更多