R 使用循环子集数据帧
我想用一个循环将一个数据帧(Springs)按年份子集,并用年份重命名该数据集R 使用循环子集数据帧,r,loops,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]) } Year.df如果您提供了Springsdataset的示
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])
}
Year.df如果您提供了Springs
dataset的示例,那么解决您的问题就更容易了。
如果我正确理解了Spring
dataset结构,您可以使用dplyr
包,它可以轻松过滤您的数据集,而且对于subset
函数,您无需执行for loop
但是,如果要在baseR
代码中使用for循环
,则应循环使用Springs
数据集,而不是Year.df
以下代码涵盖了所有内容。(dplyr
、子集
和用于lool
)
库(dplyr)
Year.df您可以使用dput(Springs[38,])函数制作一个可复制的示例。顺便说一句,之所以出现“Error:object”Springs.Year.df“not found.”是因为在环境中没有声明为“Springs.Year.df”的对象。如果您创建一个小的可复制示例以及预期的输出,将更容易提供帮助。了解。
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