从 data.table 列中的每个条目中删除最后两个数字

Dropping the last two numbers from every entry in a column of data.table

前言: 我是R的初学者,渴望学习。请不要将问题的简单性(如果它是一个简单的答案)误认为是缺乏研究或努力!

下面是我正在处理的数据:

         year state age  POP
     1:   90  1001   0  239
     2:   90  1001   0  203
     3:   90  1001   1  821
     4:   90  1001   1  769
     5:   90  1001   2 1089

州列包含所有州的 FIPS 代码。为了合并,我需要状态列来匹配我的另一个数据集。为了完成这个任务,我所要做的就是省略每个 FIPS 代码的最后两个数字,这样 table 看起来像这样:

         year state age  POP
     1:   90  10     0  239
     2:   90  10     0  203
     3:   90  10     1  821
     4:   90  10     1  769
     5:   90  10     2 1089

我不知道如何在数字列上完成这项任务。 Substr() 在字符列上使这变得容易。

如果您的号码不总是 4 位数字,要省略最后两位,您可以利用 substr()

的矢量化行为
x <- rownames(mtcars)[1:5]
x
#> [1] "Mazda RX4"         "Mazda RX4 Wag"     "Datsun 710"       
#> [4] "Hornet 4 Drive"    "Hornet Sportabout"
substr(x, 1, nchar(x)-2)
#> [1] "Mazda R"         "Mazda RX4 W"     "Datsun 7"        "Hornet 4 Dri"   
#> [5] "Hornet Sportabo"

# dummy code for inside a data.table
dt[, x_new := substr(x, 1, nchar(x)-2)]

只是为了在您可能有一个非常大的数字列并且需要正确 substr 的情况下对此进行概括。 (这可能是 storing/importing 作为字符列开始的一个很好的论据,但这是一个不完美的世界...)

x <- c(10000000000, 1000000000, 100000000, 10000000, 1000000,100000,10000,1000,100)

substr(x, 1, nchar(x)-2 )
#[1] "1e+" "1e+" "1e+" "1e+" "1e+" "1e+" "100" "10"  "1" 

as.character(x)
#[1] "1e+10" "1e+09" "1e+08" "1e+07" "1e+06" "1e+05" "10000" "1000" 
#[9] "100" 

xsf <- sprintf("%.0f", x)
substr(xsf, 1, nchar(xsf)-2)
#[1] "100000000" "10000000"  "1000000"   "100000"    "10000"    
#[6] "1000"      "100"       "10"        "1"   

cbind(x, xsf, xsfsub=substr(xsf, 1, nchar(xsf)-2) )
#      x       xsf           xsfsub     
# [1,] "1e+10" "10000000000" "100000000"
# [2,] "1e+09" "1000000000"  "10000000" 
# [3,] "1e+08" "100000000"   "1000000"  
# [4,] "1e+07" "10000000"    "100000"   
# [5,] "1e+06" "1000000"     "10000"    
# [6,] "1e+05" "100000"      "1000"     
# [7,] "10000" "10000"       "100"      
# [8,] "1000"  "1000"        "10"       
# [9,] "100"   "100"         "1"