【发布时间】:2017-05-16 19:23:22
【问题描述】:
我需要从以数字类型保存的数字中获取最后两位数字并将其另存为变量,例如: 一个=1945 它需要最后两位数字并将其放在 b b=45
【问题讨论】:
-
你应该表现出你自己的努力。
我需要从以数字类型保存的数字中获取最后两位数字并将其另存为变量,例如: 一个=1945 它需要最后两位数字并将其放在 b b=45
【问题讨论】:
可以使用取模运算符%%
a <- 1945
b <- 1945 %% 100
#b = 45
【讨论】:
如果您使用年份,最好(以及我用于此的)可能是 sprintf 与 %% 结合使用,这会将数字转换为字符串,但会将 1905 保留为 05 5(根据您的应用程序可能更可取):
sprintf('%02d', 1999:2010 %% 100)
# [1] "99" "00" "01" "02" "03" "04" "05" "06" "07" "08" "09" "10"
回过头来补充一下,从正确利用基础 R 中的日期/时间实用程序的意义上说,也许更“正确”的方法可能是首先转换为 Date,然后使用 format:
format(.Date(365.25 * (1999:2010 - 1969.75)), '%y')
# [1] "99" "00" "01" "02" "03" "04" "05" "06" "07" "08" "09" "10"
1969.75 将 1970 年左右的年份重新居中(请参阅 .Date(0L)),但我们需要将其重新居中以考虑闰年。
然而,由于闰世纪,即使这样也只能在大约 400 年(或者可能多达 1600 年?)内保持正确......对于如此广泛的日期,Dates 的前进方向是:
format(as.Date(sprintf('%d-01-01', 1999:2010)), '%y')
【讨论】:
怎么样...
a <- 1945
b <- a - round(a, -2)
b
[1] 45
这是假设没有小数,当然。
这具有保留符号的附带好处...
a <- -1945
b <- a - round(a, -2)
b
[1] -45
【讨论】:
1966 - round(1966, -2) 是 -34。
您可以直接使用substr(),它会检测并将numeric 转换为string。需要转换回数字。例如:
num = c(1112, 1113)
trim = as.numeric(substr(num, nchar(num[1])-1, nchar(num[1])))
【讨论】:
对于后代,这允许在小数点后尾随零。这也不需要计算字符串/数字的长度。
stringr 具有 str_sub 函数,f_pad_right 来自 numform 包。
这会从一个数字中获取最后一位数字:
> library(stringr)
> library(numform)
> str_sub(f_pad_right(as.character(1.20), pad.char = 0,width = 4), - 1, - 1)
[1] "0"
最后两位数:
> str_sub(f_pad_right(as.character(1.20), pad.char = 0,width = 4), - 2, - 1)
[1] "20"
回答 OP 问题:
> str_sub(f_pad_right(as.character(1945), pad.char = 0,width = 4), - 2, - 1)
[1] "45"
【讨论】: