代码之家  ›  专栏  ›  技术社区  ›  Jonathan Nolan

向现有数据框添加列

r
  •  0
  • Jonathan Nolan  · 技术社区  · 6 年前

    我有一个数据帧列表,希望对数据帧中的每一列执行一个函数。

    我在谷歌上搜索了一段时间,但问题是:

    df.1 <- data.frame(data=cbind(rnorm(5, 0), rnorm(5, 2), rnorm(5, 5)))
    df.2 <- data.frame(data=cbind(rnorm(5, 0), rnorm(5, 2), rnorm(5, 5)))
    
    names(df.1) <- c("a", "b", "c")
    names(df.2) <- c("a", "b", "c")
    
    ls.1<- list(df.1,df.2)
    
    
    res <- lapply(ls.1, function(x){
      x$d <- x$b + x$c
      return(x)
    })
    

    返回一个新列表“res”,其中包含一组未命名的数据帧(res[[1]]、res[[2]]等)。

    [[1]]
               a        b        c        d
    1  2.2378686 3.640607 4.793172 8.433780
    2 -0.4411046 3.690850 5.290814 8.981664
    3 -1.1490879 3.081092 4.982820 8.063912
    4 -0.3024211 1.929033 4.743569 6.672602
    5  1.3658726 3.395564 2.800131 6.195695
    
    [[2]]
               a        b        c         d
    1  0.3452530 3.264709 7.384127 10.648836
    2 -1.2031949 3.118633 4.840496  7.959129
    3  0.6177369 1.119107 4.938917  6.058024
    4 -1.0470713 1.942357 5.747748  7.690106
    5  0.8732836 2.704501 5.805754  8.510254
    

    我对在原始数据帧(df.1,df.2)中添加列很感兴趣,我该怎么做?

    2 回复  |  直到 6 年前
        1
  •  2
  •   moodymudskipper    6 年前

    您可以命名列表元素,或使用 tibble::lst 它会帮你:

    ls.1<- list(df.1 = df.1,df.2 = df.2)
    ls.2<- tibble::lst(df.1, df.2)
    
    res1 <- lapply(ls.1, function(x){
      x$d <- x$b + x$c
      return(x)
    })
    
    res2 <- lapply(ls.2, function(x){
      x$d <- x$b + x$c
      return(x)
    })
    
    # $df.1
    #            a         b        c        d
    # 1  0.6782608 4.0774244 2.845351 6.922776
    # 2  2.3620601 1.9395314 5.438832 7.378364
    # 3 -0.5913838 2.0579972 4.312360 6.370357
    # 4  0.5532147 0.8581389 5.867889 6.726027
    # 5 -0.3251044 1.9838598 4.321008 6.304867
    # 
    # $df.2
    #            a        b        c        d
    # 1  1.9918131 3.195105 5.715858 8.910963
    # 2  0.2525537 2.507358 5.040691 7.548050
    # 3  0.5038298 3.112855 5.265974 8.378830
    # 4  0.4873384 3.377182 5.685714 9.062896
    # 5 -0.6539881 0.157948 5.407508 5.565456
    

    覆盖原始数据的步骤。可以使用 list2env 在输出端。

        2
  •  0
  •   Roman LuÅ¡trik    6 年前

    要添加列,必须覆盖 ls.1 具有 res 或者手动将结果分配给原始的data.frames。 df.1 <- res[[1]] . 但是有一百种方法可以剥猫皮(双关语的意思),也许还有其他更好的方法。