[英]Using lapply instead of for loop in r
我在编写替换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
谢谢(已编辑以添加缺少的代码)
lapply
是错误的方法。 上面的lapply
代码不起作用的原因是因为您正在修改函数中的对象,该对象在函数环境中修改了本地副本。 任何apply
函数都将捕获返回值并对其进行汇总; 您不应该依赖函数的副作用。
您实际上是在这里执行合并。 使用merge
:
wk <- data.frame(wk=wks, season=wk.seas)
merge(wk, dat1)
解决问题的方法可能有很多,但是想到了两种快速解决方案:
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为合并/联接,如果您有其他季节表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.