当前位置: 首页 > 知识库问答 >
问题:

从mutate_向每个函数传递列名

越俊驰
2023-03-14

我想通过dplyr::mutate_each将转换应用于所有列,例如。

library(dplyr)
mult <- function(x,m) return(x*m)
mtcars %>% mutate_each(funs(mult(.,2)))    # Multiply all columns by a factor of two

但是,根据列名,转换应该有参数。因此,列名应该作为附加参数传递给函数

named.mult <- function(x,colname) return(x*param.A[[colname]])

示例:将每列乘以不同的系数:

param.A <- c()
param.A[names(mtcars)] <- seq(length(names(mtcars)))
param.A
# mpg  cyl disp   hp drat   wt qsec   vs   am gear carb 
#   1    2    3    4    5    6    7    8    9   10   11 

由于列名在mutate_each期间丢失,我目前通过将一个具有延迟计算的列表传递给mutate_(SE版本)来解决这个问题:

library(lazyeval)
named.mutate <- function(fun, cols) sapply(cols, function(n) interp(~fun(col, n), fun=fun, col=as.name(n)))
mtcars %>% mutate_(.dots=named.mutate(named.mult, names(.)))

是的,但是有一些特殊的变量,比如。包含的列名的名称。每一次colwise处决?所以我可以做一些

mtcars %>% mutate_each(funs(named.mult(.,.name)))

共有1个答案

莫振
2023-03-14

我建议采取不同的方法。而不是使用mutate_each组合dplyr::变tidyr::聚集tidyr::传播可以获得相同的结果。

例如:

library(dplyr)
library(tidyr)

data(mtcars)

# Multiple each column by a different interger
mtcars %>% 
  dplyr::tbl_df() %>%
  dplyr::mutate(make_and_model = rownames(mtcars)) %>%
  tidyr::gather(key, value, -make_and_model) %>% 
  dplyr::mutate(m = as.integer(factor(key)),   # a multiplication factor dependent on column name
                value = value * m) %>% 
  dplyr::select(-m) %>%
  tidyr::spread(key, value)

# compare to the original data
mtcars[order(rownames(mtcars)), order(names(mtcars))]

# the muliplicative values used.
mtcars %>% 
  tidyr::gather() %>% 
  dplyr::mutate(m = as.integer(factor(key))) %>% 
  dplyr::select(-value) %>%
  dplyr::distinct()
 类似资料:
  • 问题内容: 我不太明白为什么我不能将Int []从一个函数传递到另一个函数: 这给了我以下错误: 谢谢你的帮助! 问题答案: 中的参数称为 可变参数 。这意味着您可以传入该参数类型的可变数量,并且传入的所有内容都将转换为该类型的数组,以供您在函数中使用。 因此,内部的参数是一个数组,而不是所期望的一组参数。 您可能想要像这样重载以接受其中任何一个,因此您的平均函数可以调用适当的版本:

  • 我正在尝试将参数传递给作为参数传递的函数指针。 代码: 我得到了这个错误: 类型"void"的参数与类型"void(*)(wchar_t*,wchar_t*)"的参数不兼容 如何解决此问题以完成我想要实现的目标? 编辑:对不起,不清楚。我实际上试图完成的是将函数注入子进程并传递两个参数(wchar_t*、wchar_t*),以便我可以使用它们。但主函数可以是void或int argc、char**

  • null 或使用数组 然而,在我们的应用程序中,我看到开发人员使用的语法是 请注意,没有array[],但是两个回调函数以逗号分隔的形式传递。这起作用了。只是好奇怎么会?

  • 总而言之,字符串数组输出月份名称,用户输入存储在单独的数组中用于计算。这些计算输出的是总量和平均值,但总降雨量需要与相应实体的月份进行比较,最高和最低的输出需要是字符串,而不是数字。

  • Go 语言数组 如果你想向函数传递数组参数,你需要在函数定义时,声明形参为数组,我们可以通过以下两种方式来声明: 方式一 形参设定数组大小: void myFunction(param [10]int) { . . . } 方式二 形参未设定数组大小: void myFunction(param []int) { . . . } 实例 让我们看下以下实例,实例中函数接收整型数组参数,另一个参数

  • 清单2.4中,向std::thread构造函数中的可调用对象,或函数传递一个参数很简单。需要注意的是,默认参数要拷贝到线程独立内存中,即使参数是引用的形式,也可以在新线程中进行访问。再来看一个例子: void f(int i, std::string const& s); std::thread t(f, 3, "hello"); 代码创建了一个调用f(3, "hello")的线程。注意,函数f需