我正在使用下面的数据框,其中包含1997 - 2010年每年的列变量数据,以及列'min'和'max'描述的年份范围。
如果年份在最小值到最大值范围内,我希望每年列中的值更改为1。我该怎么做?
library(tidyverse)
df <- structure(list(`1997` = c(1, 0, 0, 0, 0, 0), `1998` = c(0, 0,
0, 0, 0, 0), `1999` = c(0, 0, 0, 0, 0, 0), `2000` = c(0, 0, 0,
1, 0, 1), `2001` = c(0, 0, 0, 1, 0, 1), `2002` = c(0, 0, 0, 0,
0, 1), `2003` = c(0, 0, 0, 0, 0, 1), `2004` = c(0, 0, 0, 0, 0,
1), `2005` = c(0, 0, 0, 1, 0, 1), `2006` = c(0, 0, 1, 0, 0, 1
), `2007` = c(0, 0, 1, 1, 0, 1), `2008` = c(0, 0, 1, 1, 0, 1),
`2009` = c(0, 0, 1, 1, 0, 1), `2010` = c(0, 0, 1, 1, 0, 1
), min = c(1997, 1998, 2006, 2000, 1997, 2000), max = c(1998,
1998, 2010, 2010, 2008, 2010)), row.names = c(NA, -6L), class = c("tbl_df",
"tbl", "data.frame"), .Names = c("1997", "1998", "1999", "2000",
"2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008",
"2009", "2010", "min", "max"))
我尝试使用mutate_at
包中的dplyr
并创建一个向量来分配这些列(并稍后进行操作),但我正在努力解决这个问题。如何将以下调用更改为funs()
,以便我可以将该范围内的所有0更改为1?
for (i in 1:nrow(df)){
if (!is.na(df[i,]$min) & !is.na(df[i,]$max)){
df[i,] <- df[i,] %>%
mutate_at(vars(`1997`:`2010`), funs(min:max))
}
}
答案 0 :(得分:1)
一种解决方案可能是使用sapply
和mapply
,如下所示。我也使用between
中的dplyr
函数。
而不是0
和1
我的解决方案显示FALSE/TRUE
。希望OP很好。
#df has been taken from OP
sapply(names(df)[1:(ncol(df)-2)],
function(x)mapply(between, as.numeric(x), df$min, df$max)) %>%
as.data.frame() %>% cbind(df[,c("min","max")])
1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 min max
1 TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 1997 1998
2 FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 1998 1998
3 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE 2006 2010
4 FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 2000 2010
5 TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE 1997 2008
6 FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 2000 2010