R 如何循环字符串的一部分并创建新列

R 如何循环字符串的一部分并创建新列,r,dataframe,R,Dataframe,从2000年到2020年,我需要为所有的弱点制作假人,并考虑使用for循环。我的数据是这样的 df <- data.frame( Time = c("2000W01","2000W02", "2000W03", "2000W04" ,"2001W01","2001W02", "2001W03", "20

从2000年到2020年,我需要为所有的弱点制作假人,并考虑使用for循环。我的数据是这样的

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)