R语言 使用矢量化函数参数进行变异

ioekq8ef  于 2022-12-20  发布在  其他
关注(0)|答案(4)|浏览(131)

我知道“cross”范例是“许多列,一个函数”,所以这可能是不可能的。
我使用cur_column()使其工作,但它基本上相当于逐个计算参数,而不是提供一个大小等于包含参数的列数的向量。
第一个区块产生了我想要的结果,但我想知道是否有更干净的方法。

library(dplyr)

df = data.frame(column1 = 1:100, column2 = 1:100)

parameters = data.frame(
    column_names = c('column1','column2'),
    parameters = c(10,100))
    
custom_function = function(x,addend){
    x + addend
}

df2 = df %>% mutate(
    across(x$column_names,
           ~custom_function(.,addend = x %>%
                                        filter(column_names == cur_column()) %>% 
                                        pull(parameters))))

我想对最后一行做的是

df2 = df %>% mutate(
    across(x$column_names,~custom_function(.,addend = x$parameters)))
k2fxgqgv

k2fxgqgv1#

我们可以在base中用mapply来实现这一点:

mapply(`+`, df[,parameters$column_names], parameters$parameters)

##>      column1 column2
##> [1,]      11     101
##> [2,]      12     102
##> [3,]      13     103
##> [4,]      14     104
##> [5,]      15     105
##> ...
o4tp2gmn

o4tp2gmn2#

我认为对参数操作的Map函数比对数据操作的across更容易:

library(tidyverse)

with(parameters, as_tibble(map2(df[column_names], parameters, custom_function)))
#> # A tibble: 100 x 2
#>    column1 column2
#>      <dbl>   <dbl>
#>  1      11     101
#>  2      12     102
#>  3      13     103
#>  4      14     104
#>  5      15     105
#>  6      16     106
#>  7      17     107
#>  8      18     108
#>  9      19     109
#> 10      20     110
#> # ... with 90 more rows

创建于2022年12月15日,使用reprex v2.0.2

xzv2uavs

xzv2uavs3#

编辑(第二列不起作用)。我不认为across是你想要的。另一个答案更好。你也可以像这样把列添加到你的函数中:

library(dplyr)

df = data.frame(column1 = 1:100, column2 = 1:100)

parameters = data.frame(
  column_names = c('column1','column2'),
  parameters = c(10,100))

custom_function = function(x,column, parameters){
  addend = parameters %>%
    filter(column_names == column) %>% 
    pull(parameters)
  x + addend
}

df2 = df %>% mutate(
  across(parameters$column_names,custom_function,cur_column(),parameters))
jfgube3f

jfgube3f4#

我们可以在column_names列为"parameters"的列名(cur_column())上使用match,并提取"parameters"列值以用作custom_function中的输入

library(dplyr)
df %>%
   mutate(across(all_of(parameters$column_names), 
     ~ custom_function(.x, parameters$parameters[match(cur_column(), 
      parameters$column_names)])))
  • 输出
column1 column2
1        11     101
2        12     102
3        13     103
4        14     104
5        15     105
6        16     106
7        17     107
8        18     108
...

或者将两列 Dataframe 转换为命名向量(deframe),并直接从name中提取值

library(tibble)
params <- deframe(parameters)
df %>%
  mutate(across(all_of(names(params)),
   ~ custom_function(.x, params[cur_column()])))
  • 输出
column1 column2
1      11     101
2      12     102
3      13     103
4      14     104
5      15     105
6      16     106
...

相关问题