代码之家  ›  专栏  ›  技术社区  ›  Quinten

用于翻领内侧的环

  •  0
  • Quinten  · 技术社区  · 3 年前

    我有以下简化的数据帧df( dput 以下):

    > df
      group value
    1     A     1
    2     A     4
    3     B     2
    4     B     3
    5     C     2
    6     C     1
    

    我想使用为每组应用for循环 lapply 。因此,首先我使用 split 。然后我想在每个数据帧中执行for循环,但它不起作用。以下是一些可重复的代码(请注意简化的for循环以使其可重复):

    df = data.frame(group = c("A", "A", "B", "B", "C", "C"),
                    value = c(1, 4, 2, 3, 2, 1))
    
    l = split(df, df$group)
    lapply(l, \(x) {
      for(i in 1:nrow(x)) {
        if(x$value[i] == 1) {
          x$value[i] = x$value[i] + 1
        } else
          x$value[i] = x$value[i] + 2
      }
    })
    #> $A
    #> NULL
    #> 
    #> $B
    #> NULL
    #> 
    #> $C
    #> NULL
    

    创建于2023-02-15 reprex v2.0.2

    这应该在为1的值上加1,否则加2(这非常简单,但可重复)。正如您所看到的,它返回NULL。预期输出应如下所示:

    $A
      group value
    1     A     2
    2     A     6
    
    $B
      group value
    3     B     3
    4     B     5
    
    $C
      group value
    5     C     4
    6     C     2
    

    所以我想知道如何将for循环应用于 lapply ?为什么它回来了 NULL ?


    dput df:

    df<-structure(list(group = c("A", "A", "B", "B", "C", "C"), value = c(1, 
    4, 2, 3, 2, 1)), class = "data.frame", row.names = c(NA, -6L))
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   MrFlick    3 年前

    A. for loop-aways返回 NULL 价值如果您希望函数返回更新的 x 值,然后确保添加 x 直到函数结束,或者 return(x) 更明确一点。

    l = split(df, df$group)
    lapply(l, \(x) {
      for(i in 1:nrow(x)) {
        if(x$value[i] == 1) {
          x$value[i] = x$value[i] + 1
        } else
          x$value[i] = x$value[i] + 2
      }
      x
    })