转换数据以对其进行润滑

时间:2019-05-14 14:46:17

标签: r character numeric lubridate

首先感谢您对其他帖子的所有回答,这对我有很大帮助。 有我的第一个。

我有这种数据:

 [1] 1986.05 1986.06 1986.07 1986.08 1986.09 1986.10 1986.11 1986.12 1987.01 1987.02 1987.03 1987.04 1987.05 1987.06

我想将其转换为

 [1] 1986-05 1986-06 1986-07 1986-08 1986-09 1986-10 1986-11 1986-12 1987-01 1987-02 1987-03 1987-04 1987-05 1987-06

我尝试使用gsub()或粘贴my data + "-01',但这是问题所在:它将我的数据转换为一个字符:1986.10变成1986-1

应该是一个月,所以.10与.1。不同。

我无法真正解释自己如何做到步入正轨,但是现在我真的很想知道如何直接从R转换它! (在Excel上会更容易)

谢谢!


编辑:

我正在编辑帖子以提供有关该问题的详细信息。

问题在于大多数方法将列从数字转换为字符。

结果是1986.10 [1986年10月]变成1986.1 [1986年1月]。似乎字符值的末尾不能有“ 0”。但是重要的是要保持它...

2 个答案:

答案 0 :(得分:6)

假设它是Year.month,有多种方法可以执行此操作。将其转换为yearmon类(来自zoo),然后更改format

library(zoo)
format(as.yearmon(as.character(v1), format = "%Y.%m"), "%Y-%m")  
#[1] "1986-05" "1986-06" "1986-07"

或者可以通过使用.-替换为sub来做到这一点

sub(".", "-", v1, fixed = TRUE)
#[1] "1986-05" "1986-06" "1986-07"

如果该值为数字,则无法区分1986.11986.10。一种选择是将其读取为字符向量/列('v2'),然后对其进行处理

format(as.yearmon(v2, format = "%Y.%m"), "%Y-%m")
#[1] "1986-01" "1986-10" "1986-05"

数据

v1 <- c(1986.05, 1986.06, 1986.07)
v2 <- scan(text = "1986.1,1986.10,1986.5", what = "", sep=",", quiet = TRUE)

答案 1 :(得分:1)

data have;
format year_mon_decimal_number 7.2; 
input year_mon_decimal_number @@; datalines;
1986.05 1986.06 1986.07 1986.08 1986.09 1986.10 1986.11 1986.12 1987.01 1987.02 1987.03 1987.04 1987.05 1987.06
run;

data want;
  set have;
  date = input (put(year_mon_decimal_number*100,6.), yymmn6.); 
  format date yymmd7.;
run;