【问题标题】:Using lapply instead of for loop in r在 r 中使用 lapply 而不是 for 循环
【发布时间】:2015-10-07 18:52:08
【问题描述】:

我在编写一个函数来替换 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

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

【问题讨论】:

  • 但是你的循环没有产生你想要的返回值,错误:找不到对象'wk.seas'。
  • @user 对不起,我没有复制我需要的所有东西——它现在应该可以工作了
  • 你有关于每个季节构成的代码吗?例如,“赢”覆盖了哪些数字等,如果是这样,您可以采用这种方法。
  • @CDVAK 为什么要使用 lapply?

标签: r


【解决方案1】:

lapply 是错误的方法。上面的lapply 代码不起作用的原因是因为您正在修改函数内的对象,这会修改函数环境中的本地副本。任何apply 函数都将捕获返回值并将其聚合;你不应该依赖函数的副作用。

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

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

【讨论】:

    【解决方案2】:

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

    1. Ifelse:

    dat1$seas &lt;- ifelse(dat1$wk&gt;=15 &amp; dat1$wk&lt;41, "summer", NA)

    1. 基本命令:

    dat1[dat1$wk&gt;=15 &amp; dat1$wk&lt;45,2] &lt;- "summer"

    您需要为每个要指定的季节设置一个。

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

    编辑:如果您在其他地方有季节表,则为合并/加入 +1。

    【讨论】:

    • 我使用了五行“2.基本命令”代码来添加季节,而不是尝试编写一个函数来一步完成。谢谢,
    • 如果您列出了季节列表及其标准,则只需按以下方式返回此合并是正确的方法。我将此回复发布到您问题的后期编辑版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多