如何从一列中将年,月,日和时间提取到4个不同的列中

时间:2015-09-24 06:30:56

标签: r

我有一个包含

列的数据集
Year
1/1/1996 9:00
1/2/1996 9:00
1/3/1996 9:00
1/4/1996 9:00
1/5/1996 9:00
1/6/1996 9:00
1/7/1996 9:00
1/8/1996 9:00
1/9/1996 9:00
1/10/1996 9:00

我想创建4个不同的列,看起来像这样

Year            Month   Day   Year  Time
1/1/1996 9:00   1       1     1996  9:00
1/2/1996 9:00   1       2     1996  9:00 
1/3/1996 9:00   1       3     1996  9:00 
1/4/1996 9:00   1       4     1996  9:00
1/5/1996 9:00   1       5     1996  9:00
1/6/1996 9:00   1       6     1996  9:00
1/7/1996 9:00   1       7     1996  9:00
1/8/1996 9:00   1       8     1996  9:00
1/9/1996 9:00   1       9     1996  9:00
1/10/1996 9:00  1       10    1996  9:00

是否可以在R中执行此操作?

2 个答案:

答案 0 :(得分:3)

我们可以使用separate中的library(tidyr)。我们指定要在into中创建的新变量。其他参数包括sep指定分隔符,remove返回保留原始列,并使用type.convert=TRUE更改新变量的列类。

library(tidyr)
separate(df1, Year, into=c('Month', 'Day', 'Year', 'Time'),
                      sep='[/ ]', remove=FALSE, type.convert=TRUE)
#             Year Month Day Year Time
#1   1/1/1996 9:00     1   1 1996 9:00
#2   1/2/1996 9:00     1   2 1996 9:00
#3   1/3/1996 9:00     1   3 1996 9:00
#4   1/4/1996 9:00     1   4 1996 9:00
#5   1/5/1996 9:00     1   5 1996 9:00
#6   1/6/1996 9:00     1   6 1996 9:00
#7   1/7/1996 9:00     1   7 1996 9:00
#8   1/8/1996 9:00     1   8 1996 9:00
#9   1/9/1996 9:00     1   9 1996 9:00
#10 1/10/1996 9:00     1  10 1996 9:00

另一个选项是来自tstrsplit的{​​{1}}。我们转换了' data.frame'到' data.table' (data.table),分开'年'列(setDT(df1))并分配输出(tstrsplit(Year, ...))以创建新列。

:=

或其他选项library(data.table)#v1.9.6+ setDT(df1)[, c('Month', 'Day', 'year', 'Time') := tstrsplit(Year, '[/ ]', type.convert=TRUE)] 来自cSplit

library(splitstackshape)

数据

library(splitstackshape)
cSplit(df1, 'Year', '[/ ]', fixed=FALSE, drop=FALSE, type.convert=TRUE)

答案 1 :(得分:1)

你可以使用一些包。

library(readr)
library(dplyr)
library(lubridate)
library(stringi)
df <- read_tsv("Year
            1/1/1996 9:00
            1/2/1996 9:00
            1/3/1996 9:00
            1/4/1996 9:00
            1/5/1996 9:00
            1/6/1996 9:00
            1/7/1996 9:00
            1/8/1996 9:00
            1/9/1996 9:00
            1/10/1996 9:00", 
            col_types = list(Year = col_datetime(format = "%d/%m/%Y %H:%M")))

mutate_each(df, 
            funs(month, day, year, hour, stri_datetime_format(time = Year,     
            format = "HH:mm", tz = "UTC")), 
            Year)