用循环子集数据帧

时间:2021-05-30 00:41:00

标签: r loops

我想使用循环按年份对数据框 (Springs) 进行子集化,并使用年份重命名该数据集。

Year.df <- matrix(nrow = 38, ncol = 1)
Year.df[,1] <- 1982:2019

for(i in 1:38){
Springs.Year.df[i,1] <- subset(Springs, DayNum <= 43 & BookYear == Year.df[i,1])
}

我明白了:

<块引用>

错误:找不到对象“Springs.Year.df”。

1 个答案:

答案 0 :(得分:0)

如果您提供了 Springs 数据集的示例,那么解决您的问题会更容易。
如果我正确理解 Spring 数据集结构,您可以改用 dplyr 包,它可以轻松过滤您的数据集,同样对于 subset 函数,您不需要执行 for loop .
但是如果你想在 for loop 代码中使用 baseR,你应该循环遍历 Springs 数据集,而不是 Year.df
以下代码涵盖了所有。(dplyr, subset and for lool)

library(dplyr)

Year.df <- matrix(nrow = 38, ncol = 1)
Year.df[,1] <- 1982:2019

# Creating an example dataset
Springs <- data.frame(
  DayNum = sample(10:100, 1000, replace = TRUE),
  BookYear = sample(1975:2021, 1000, replace = TRUE)
)

##------------------------------------------------
## dplyr, filter method
##------------------------------------------------  
Springs.Year.df <- Springs %>%
  filter(DayNum <= 43 & BookYear %in% Year.df)

#Result:

head(Springs.Year.df)
##   DayNum BookYear
## 1     31     2010
## 2     25     1982
## 3     29     1987
## 4     23     1985
## 5     17     1999
## 6     23     2005

nrow(Springs.Year.df)
## [1] 256



##-------------------------------------------------------------
## Subset method
##-------------------------------------------------------------

Springs.Year.df <- subset(Springs, DayNum <= 43 & BookYear %in% Year.df)


#Check the Result
head(Springs.Year.df)
##   DayNum BookYear
## 5     31     2010
## 7     25     1982
## 8     29     1987
## 17    23     1985
## 18    17     1999
## 22    23     2005

nrow(Springs.Year.df)
## [1] 256


##------------------------------------------------
## For loop method
##------------------------------------------------
Springs.Year.df <- data.frame()
#for loop for subsetting
for(i in 1:(nrow(Springs))){
  Day = ifelse(Springs$DayNum[i] <= 43, Springs$DayNum[i], "None")
  Year = ifelse(Springs$BookYear[i] %in% Year.df, Springs$BookYear[i], "None")
  if(Day != "None" & Year != "None"){
  to_add <- data.frame(DayNum = Day, BookYear = Year)
  Springs.Year.df <- rbind(to_add, Springs.Year.df)
  }
}


#Check the Result
head(Springs.Year.df)
##   DayNum BookYear
## 1     37     2018
## 2     41     2018
## 3     22     2013
## 4     35     2015
## 5     35     2007
## 6     23     2005
nrow(Springs.Year.df)
## [1] 256