在r中使用lapply而不是for循环

时间:2015-10-07 18:52:09

标签: 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

谢谢 (编辑添加缺失的代码)

2 个答案:

答案 0 :(得分:4)

lapply是错误的做法。上面的lapply代码不起作用的原因是因为您正在修改函数中的对象,该对象修改了函数环境中的本地副本。任何apply函数都将捕获返回值并对其进行汇总;你不应该依赖功能副作用。

你真的在这里进行合并。使用merge

wk <- data.frame(wk=wks, season=wk.seas)
merge(wk, dat1)

答案 1 :(得分:1)

可能有很多方法可以解决这个问题,但我想到了两个快速解决方案:

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

    1. 基本命令:
    2. dat1[dat1$wk>=15 & dat1$wk<45,2] <- "summer"

      你想要指定每个季节一个。

      此外,在创建dat1时,$ wk被格式化为一个因子;我必须通过dat1$wk <- as.numeric(dat1$wk)以便能够执行上述任一操作。

      编辑:合并/加入+1,如果你有其他地方的季节表。