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年