我在写一个函数来替换R中的for()循环时遇到了麻烦。
我的数据如下:
dat1<-rep(sprintf("%02d", 0:52),10)
dat1<-as.data.frame(dat1[40:length(dat1)])
colnames(dat1)<-c("wk")
wk.seas<-c(rep("win",9),rep("spr",13),rep("sum",13),rep("aut",13),rep("win",6))
wks<-sprintf("%02d", 0:53)
这个循环产生了我想要的东西:
for(j in seq_along(dat1[,1])){
dat1$season[dat1[,1]==wks[j]]<-wk.seas[j]
}#works
我希望在df中创建一个矢量,其中季节值对应于一年中的一周。
这是我尝试用函数/ lapply组合复制这个循环:
lapply(seq_along(dat1$wk), function(d){
dat1$season[dat1$wk==wks[d]]<-wk.seas[d]
}) #not working
谢谢 (编辑添加缺失的代码)
答案 0 :(得分:4)
lapply
是错误的做法。上面的lapply
代码不起作用的原因是因为您正在修改函数中的对象,该对象修改了函数环境中的本地副本。任何apply
函数都将捕获返回值并对其进行汇总;你不应该依赖功能副作用。
你真的在这里进行合并。使用merge
:
wk <- data.frame(wk=wks, season=wk.seas)
merge(wk, dat1)
答案 1 :(得分:1)
可能有很多方法可以解决这个问题,但我想到了两个快速解决方案:
Ifelse
: dat1$seas <- ifelse(dat1$wk>=15 & dat1$wk<41, "summer", NA)
dat1[dat1$wk>=15 & dat1$wk<45,2] <- "summer"
你想要指定每个季节一个。
此外,在创建dat1时,$ wk被格式化为一个因子;我必须通过dat1$wk <- as.numeric(dat1$wk)
以便能够执行上述任一操作。
编辑:合并/加入+1,如果你有其他地方的季节表。