我有一个包含
列的数据集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中执行此操作?
答案 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)