问题描述
我有很多按这样的日期组织的气候数据。
df = data.frame(date = c("2011-03-24","2011-02-03","2011-01-02"),Precipitation = c(20,22,23))
我想像这样组织它
df = data.frame(year = c("2011","2011","2011"),month = c("03","02","01"),day = c("24","03","02"),pp = c(20,23))
我有很多信息,我无法手动完成。
有人可以帮我吗?非常感谢。
解决方法
使用 strsplit 你可以这样做:
逻辑:strsplit 将用破折号分割日期以创建 3 个元素的列表,每个元素包含年、月和日的 3 个部分。我们使用 rbind 绑定这些元素,但要迭代地进行。我们使用 do.call,所以 do.call 会将这些列表元素行绑定成 3 行。由于结果是一个矩阵,我们将其转换为数据帧,然后使用 setNames 为列指定新名称。最后一个 cbind 将这些 3x3 数据框与原始降水绑定。
cbind(setNames(data.frame(do.call('rbind',strsplit(df$date,'-'))),c('Year','month','day')),'Precipitation' = df$Precipitation)
输出:
Year month day Precipitation
1 2011 03 24 20
2 2011 02 03 22
3 2011 01 02 23
,
这将返回年、月和日的整数值。如果您确实需要将它们作为用 0
填充的字符,您可以在结果中使用 formatC(x,width = 2,flag = "0")
。
library(clock)
library(dplyr)
df <- data.frame(
date = c("2011-03-24","2011-02-03","2011-01-02"),pp = c(20,22,23)
)
df %>%
mutate(
date = as.Date(date),year = get_year(date),month = get_month(date),day = get_day(date)
)
#> date pp year month day
#> 1 2011-03-24 20 2011 3 24
#> 2 2011-02-03 22 2011 2 3
#> 3 2011-01-02 23 2011 1 2