使用函数式编程并更新每次迭代的基础数据帧R?

时间:2018-12-06 13:45:57

标签: r dataframe functional-programming

给出一个我要在多个列名称上运行的数据框,计算一些内容并将输出添加为新列。下次计算将作为新列添加到更新的数据框中。

例如:

给出一个简单的df:

 $(function () {$('#example').DataTable( {
        orderCellsTop: true,
    dom: 'Bfrtip',
    buttons: [
        'print'
    ],
        "columnDefs": [                   
                      {   "width": "25%", "targets": [ 1 ] }
                   ],
    "dom" : '<"top"fl<"clear">>rt<"bottom"ip<"clear">>',

                 initComplete: function () {
                     this.api().columns([1,2,3,4,5]).every(function () {
                     var column = this;
                     var select = $('<select style="width:130px; font-size: 13px; padding: 2px 1px 2px 1px; background: #fff; border: 1px solid #ccc; border-radius: 6px;position: relative; "><option value="">(All)</option></select>')
                    .appendTo($(column.header()))
                    .appendTo( $("#example thead tr:eq(1) th").eq(column.index()).empty())
                             .on('change', function () {
                                 var val = $.fn.dataTable.util.escapeRegex(
                                     $(this).val()
                                 );

                                 column
                                     .search(val ? '^' + val + '$' : '', true, false)
                                     .draw();
                             });
                         column.data().unique().sort().each(function (d, j) {
                             select.append('<option value="' + d + '">' + d + '</option>')
                } );
            } );
        }
    } );});

对于要计算的每一列a,b,c,d,说一个正方形:

df <- structure(list(a = c(1, 2, 3), b = c(4, 5, 6), c = c(7, 8, 9), 
    d = c(10, 11, 12)), .Names = c("a", "b", "c", "d"), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"))

出于技术原因,我无法发布整个数据框,但每次都要传递一个列名,并期望函数下次添加b2时会对该新列(例如a2)进行突变。已经在那里:

如果我要使用for循环,它将看起来像:

a2 = a^2
b2 = b^2 ...

所以每次我的df用新的计算列更新时。

请告知我该如何在不进行函数编程的for循环的情况下做到这一点。

我正在尝试使用for (x in column_names) { df <- df %>% mutate("x2" = x^2) } map来做到这一点,但是我的问题是我的df不会在每次迭代中都得到更新。

2 个答案:

答案 0 :(得分:2)

这是您要寻找的功能吗?

add_x2 <- function(df, x) {
  df[paste0(x, "2")] <- df[x]^2
  df
}

df %>%
  add_x2(c("a", "b"))

# A tibble: 3 x 6
      a     b     c     d    a2    b2
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     4     7    10     1    16
2     2     5     8    11     4    25
3     3     6     9    12     9    36

答案 1 :(得分:0)

使用tidyverse

df %>% 
+   mutate_if(is.numeric,funs(.^2))
# A tibble: 3 x 4
      a     b     c     d
  <dbl> <dbl> <dbl> <dbl>
1     1    16    49   100
2     4    25    64   121
3     9    36    81   144

df %>% mutate_all(funs(.^2))
# A tibble: 3 x 4
      a     b     c     d
  <dbl> <dbl> <dbl> <dbl>
1     1    16    49   100
2     4    25    64   121
3     9    36    81   144