R 使用其他列中的值更改字符串序列

R 使用其他列中的值更改字符串序列,r,dictionary,dplyr,tostring,R,Dictionary,Dplyr,Tostring,我有很多专栏,有起始年份和结束年份。我需要根据“每年采样数”列将它们转换为序列,但不是每个列都有这个值,有些列只有起始年,没有结束,因此涉及到很多“如果” 以下是我迄今为止所做的工作: df <- data_frame(first_year = c(1990, 2000, 1987, 1970, 1988), last_year = c(2010, 2020, 2004, 2018, NA), samples_per_year = c(NA, N

我有很多专栏,有起始年份和结束年份。我需要根据“每年采样数”列将它们转换为序列,但不是每个列都有这个值,有些列只有起始年,没有结束,因此涉及到很多“如果”

以下是我迄今为止所做的工作:

df <- data_frame(first_year = c(1990, 2000, 1987, 1970, 1988),
           last_year = c(2010, 2020, 2004, 2018, NA),
           samples_per_year = c(NA, NA, 4, 2, NA)) 

df %>%
  mutate(middle_years = case_when(is.na(samples_per_year) ~ map2_chr(first_year, last_year, ~ toString(if(!is.na(.y)) .x:.y else .x))))
期望输出:

# A tibble: 5 x 4
  first_year last_year samples_per_year middle_years                                            
       <dbl>     <dbl>            <dbl> <chr>                                                   
1       1990      2010             NA 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1…
2       2000      2020             NA 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2…
3       1987      2004              4 1987, 1987.25, 1987.50, 1987.75, 1988, 1988.25, 1988.50...
4       1970      2018              2 1970, 1970.5, 1971, 1971.5, 1972, 1972.5, 1973, 1973.5...                                                      
5       1988        NA             NA 1988  
#一个tible:5 x 4
第一年上一年每一年中间年取样
1990年2010年北美1990年,1991年,1992年,1993年,1994年,1995年,1996年,1997年,1998年,1…
2000年2020年北美2000年,2001年,2002年,2003年,2004年,2005年,2006年,2007年,2008年,2…
3       1987      2004              4 1987, 1987.25, 1987.50, 1987.75, 1988, 1988.25, 1988.50...
4       1970      2018              2 1970, 1970.5, 1971, 1971.5, 1972, 1972.5, 1973, 1973.5...                                                      
5 1988年不适用于1988年

您可以编写一个自定义序列函数来执行以下操作:

  my_seq<- function(from, to, mid_len){
      if(is.na(from) & is.na(to)) NA
      else if(is.na(from)) to
      else if(is.na(to)) from 
      else {
         by <- if(is.na(mid_len)) 1 else 1/mid_len
        seq(from, to,by)
      }
  }


df %>% 
   rowwise() %>%
   mutate(mid_years = toString(my_seq(first_year, last_year, samples_per_year)))

# A tibble: 5 x 4
# Rowwise: 
  first_year last_year samples_per_year mid_years                                                          
       <dbl>     <dbl>            <dbl> <chr>                                                              
1       1990      2010               NA 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ~
2       2000      2020               NA 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, ~
3       1987      2004                4 1987, 1987.25, 1987.5, 1987.75, 1988, 1988.25, 1988.5, 1988.75, 19~
4       1970      2018                2 1970, 1970.5, 1971, 1971.5, 1972, 1972.5, 1973, 1973.5, 1974, 1974~
5       1988        NA               NA 1988   
my_seq%
突变(年中=toString(我的序列(第一年、最后一年、每一年的样本)))
#一个tibble:5x4
#顺时针:
第一年上一年每半年样本
1 1990 2010 NA 1990、1991、1992、1993、1994、1995、1996、1997、1998、1999、2000、~
2000 2020 NA 2000、2001、2002、2003、2004、2005、2006、2007、2008、2009、2010、~
3       1987      2004                4 1987, 1987.25, 1987.5, 1987.75, 1988, 1988.25, 1988.5, 1988.75, 19~
4       1970      2018                2 1970, 1970.5, 1971, 1971.5, 1972, 1972.5, 1973, 1973.5, 1974, 1974~
5 1988年不适用于1988年

您可以编写一个自定义序列函数来执行以下操作:

  my_seq<- function(from, to, mid_len){
      if(is.na(from) & is.na(to)) NA
      else if(is.na(from)) to
      else if(is.na(to)) from 
      else {
         by <- if(is.na(mid_len)) 1 else 1/mid_len
        seq(from, to,by)
      }
  }


df %>% 
   rowwise() %>%
   mutate(mid_years = toString(my_seq(first_year, last_year, samples_per_year)))

# A tibble: 5 x 4
# Rowwise: 
  first_year last_year samples_per_year mid_years                                                          
       <dbl>     <dbl>            <dbl> <chr>                                                              
1       1990      2010               NA 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ~
2       2000      2020               NA 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, ~
3       1987      2004                4 1987, 1987.25, 1987.5, 1987.75, 1988, 1988.25, 1988.5, 1988.75, 19~
4       1970      2018                2 1970, 1970.5, 1971, 1971.5, 1972, 1972.5, 1973, 1973.5, 1974, 1974~
5       1988        NA               NA 1988   
my_seq%
突变(年中=toString(我的序列(第一年、最后一年、每一年的样本)))
#一个tibble:5x4
#顺时针:
第一年上一年每半年样本
1 1990 2010 NA 1990、1991、1992、1993、1994、1995、1996、1997、1998、1999、2000、~
2000 2020 NA 2000、2001、2002、2003、2004、2005、2006、2007、2008、2009、2010、~
3       1987      2004                4 1987, 1987.25, 1987.5, 1987.75, 1988, 1988.25, 1988.5, 1988.75, 19~
4       1970      2018                2 1970, 1970.5, 1971, 1971.5, 1972, 1972.5, 1973, 1973.5, 1974, 1974~
5 1988年不适用于1988年