R 如何循环字符串的一部分并创建新列
从2000年到2020年,我需要为所有的弱点制作假人,并考虑使用for循环。我的数据是这样的R 如何循环字符串的一部分并创建新列,r,dataframe,R,Dataframe,从2000年到2020年,我需要为所有的弱点制作假人,并考虑使用for循环。我的数据是这样的 df <- data.frame( Time = c("2000W01","2000W02", "2000W03", "2000W04" ,"2001W01","2001W02", "2001W03", "20
df <- data.frame( Time = c("2000W01","2000W02", "2000W03", "2000W04"
,"2001W01","2001W02", "2001W03", "2001W04",
"2002W01","2002W02", "2002W03", "2002W04"),
Total = c(rep(3,12)))
df
Time Total
1 2000W01 3
2 2000W02 3
3 2000W03 3
4 2000W04 3
5 2001W01 3
6 2001W02 3
7 2001W03 3
8 2001W04 3
9 2002W01 3
10 2002W02 3
11 2002W03 3
12 2002W04 3
df您可以在
分配季节时使用case\u,并将数据转换为宽格式
library(dplyr)
library(tidyr)
df %>%
mutate(season = case_when(grepl('W01', Time) ~ 'spring',
grepl('W02', Time) ~ 'summer',
grepl('W03', Time) ~ 'autumn',
grepl('W04', Time) ~ 'winter')) %>%
pivot_wider(names_from = season, values_from = season,
values_fn = length, values_fill = 0)
# Time Total spring summer autumn winter
# <chr> <dbl> <int> <int> <int> <int>
# 1 2000W01 3 1 0 0 0
# 2 2000W02 3 0 1 0 0
# 3 2000W03 3 0 0 1 0
# 4 2000W04 3 0 0 0 1
# 5 2001W01 3 1 0 0 0
# 6 2001W02 3 0 1 0 0
# 7 2001W03 3 0 0 1 0
# 8 2001W04 3 0 0 0 1
# 9 2002W01 3 1 0 0 0
#10 2002W02 3 0 1 0 0
#11 2002W03 3 0 0 1 0
#12 2002W04 3 0 0 0 1
库(dplyr)
图书馆(tidyr)
df%>%
当(grepl('W01',Time)~'spring'时,突变(季节=情况),
grepl('W02',时间)~'summer',
格雷普('W03',时间)~'秋天',
grepl('W04',Time)~'winter'))%>%
枢轴宽度(名称=季节,值=季节,
值\ fn=长度,值\填充=0)
#春夏秋冬总时间
#
#1 2000W01 3 1 0 0 0 0
#2000W02 3 0 1 0 0
#320003 300 1 0
#4 2000W04 3 0 0 1
#5 2001W01 3 1 0 0 0 0
#6 2001W02 3 0 1 0 0
#7 2001W03 3 0 1 0
#8 2001W04 3 0 0 1
#9 2002W01 3 1 0 0 0
#10 2002W02 3 0 1 0 0 0
#11 2002W03 3 0 1 0
#12 2002W04 3 0 0 1
您可以使用一个查找向量来获取特定的命名和轴心\u更宽一些
:
library(stringr)
library(dplyr)
lookup <- c("Spring", "Summer", "Autumn", "Winter")
names(lookup) <- 1:4
df %>%
mutate(week = lookup[stringr::str_sub(Time, start = -1)],
v = 1) %>%
pivot_wider(id_cols = c(Time, Total),
names_from = week,
values_from = v,
values_fill = 0)
库(stringr)
图书馆(dplyr)
查找百分比
枢轴宽度(id\U cols=c(时间,总计),
name_from=周,
值_from=v,
值(填充=0)
如果我有52周的时间,想要W48-W08(12个月)作为冬天,夏天、秋天和春天都一样,那该怎么办?我可以使用grepl(“W01 | W02 | W03”)等等吗?是的,你可以这样做。或者另一个选项是分离年和周信息,然后在%c('W01','W02'…)~'spring'中执行类似于week%的操作,“W01”和'W01'之间有区别吗?没有。没有区别。我正在尝试对月份执行相同的操作,代码运行,但我只得到1月份。我不想发表新文章,但我可以展示我的代码。就在这里
library(stringr)
library(dplyr)
lookup <- c("Spring", "Summer", "Autumn", "Winter")
names(lookup) <- 1:4
df %>%
mutate(week = lookup[stringr::str_sub(Time, start = -1)],
v = 1) %>%
pivot_wider(id_cols = c(Time, Total),
names_from = week,
values_from = v,
values_fill = 0)