给出一个我要在多个列名称上运行的数据框,计算一些内容并将输出添加为新列。下次计算将作为新列添加到更新的数据框中。
例如:
给出一个简单的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不会在每次迭代中都得到更新。
答案 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