繁体   English   中英

在R中使用lapply代替for循环

[英]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)

解决问题的方法可能有很多,但是想到了两种快速解决方案:

  1. Ifelse

dat1$seas <- ifelse(dat1$wk>=15 & dat1$wk<41, "summer", NA)

  1. 基本命令:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM