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

如何将dplyr中的动态列名传递到自定义函数中?

司易安
2023-03-14

我有一个具有以下结构的数据集:

Classes ‘tbl_df’ and 'data.frame':  10 obs. of  7 variables:
 $ GdeName  : chr  "Aeugst am Albis" "Aeugst am Albis" "Aeugst am Albis" "Aeugst am Albis" ...
 $ Partei   : chr  "BDP" "CSP" "CVP" "EDU" ...
 $ Stand1971: num  NA NA 4.91 NA 3.21 ...
 $ Stand1975: num  NA NA 5.389 0.438 4.536 ...
 $ Stand1979: num  NA NA 6.2774 0.0195 3.4355 ...
 $ Stand1983: num  NA NA 4.66 1.41 3.76 ...
 $ Stand1987: num  NA NA 3.48 1.65 5.75 ...

我想提供一个函数,它允许计算任何值之间的差异,我想这样做使用dplyrsmutate这样的函数:(假设参数作为参数传递)

from <- "Stand1971"
to <- "Stand1987"

data %>%
  mutate(diff = from - to)

当然,这不起作用,因为dplyr使用非标准评估。我知道现在有一个优雅的解决方案,可以使用mutate_uu来解决这个问题,我已经读过这个小插曲,但我仍然无法理解它。

怎么办?

以下是数据集的前几行,以获得一个可复制的示例

structure(list(GdeName = c("Aeugst am Albis", "Aeugst am Albis", 
"Aeugst am Albis", "Aeugst am Albis", "Aeugst am Albis", "Aeugst am Albis", 
"Aeugst am Albis", "Aeugst am Albis", "Aeugst am Albis", "Aeugst am Albis"
), Partei = c("BDP", "CSP", "CVP", "EDU", "EVP", "FDP", "FGA", 
"FPS", "GLP", "GPS"), Stand1971 = c(NA, NA, 4.907306434, NA, 
3.2109535926, 18.272143463, NA, NA, NA, NA), Stand1975 = c(NA, 
NA, 5.389079711, 0.4382328556, 4.5363022622, 18.749259742, NA, 
NA, NA, NA), Stand1979 = c(NA, NA, 6.2773722628, 0.0194647202, 
3.4355231144, 25.294403893, NA, NA, NA, 2.7055961071), Stand1983 = c(NA, 
NA, 4.6609804428, 1.412940467, 3.7563539244, 26.277246489, 0.8529335746, 
NA, NA, 2.601878177), Stand1987 = c(NA, NA, 3.4767860929, 1.6535933856, 
5.7451770193, 22.146844746, NA, 3.7453183521, NA, 13.702211858
)), .Names = c("GdeName", "Partei", "Stand1971", "Stand1975", 
"Stand1979", "Stand1983", "Stand1987"), class = c("tbl_df", "data.frame"
), row.names = c(NA, -10L))

共有2个答案

赵雅懿
2023-03-14

你可以使用。数据innerdplyrchain now。

library(dplyr)
from <- "Stand1971"
to <- "Stand1987"

data %>% mutate(diff = .data[[from]] - .data[[to]])

另一个选项是将sym与bang-bang(!!)一起使用

data %>% mutate(diff = !!sym(from) - !!sym(to))

在base R中,我们可以使用:

data$diff <- data[[from]] - data[[to]]
辛星宇
2023-03-14

使用最新版本的dplyr(

library(tidyverse)
from <- "Stand1971"
to <- "Stand1987"

data %>%
  mutate(diff=(!!as.name(from))-(!!as.name(to)))

您只需要将字符串转换为带有as的名称。命名,然后将它们插入表达式中。不幸的是,我似乎不得不使用比我想要的更多的括号,但是 操作员似乎处于一种奇怪的操作顺序中。

原始答案,dplyr(0.3-

从该vignette(vignette(“nse”、“dplyr”))中,使用lazyeval的interp()函数

library(lazyeval)

from <- "Stand1971"
to <- "Stand1987"

data %>%
  mutate_(diff=interp(~from - to, from=as.name(from), to=as.name(to)))

 类似资料:
  • 我编写了这个函数,它只是用子字符串替换数据表列中的每个值: 但每次我试着运行它时,我都会发现错误: 现在我已经做了很多关于为什么它不起作用的研究,但我不明白。我读过一些关于标准评估和懒散的东西,但我尝试的似乎都不管用。有什么帮助吗? 谢谢

  • 基于这个线程,我创建了一个动态列名w/dplyr::mutate(),在'dplyr'中使用动态变量名,现在我想对新列进行排序。。。。但我没有正确传递列名

  • 我试图编写一个函数,该函数采用数据帧和变量名(或变量名列表),并使用group_by和summary函数输出摘要信息。然而,我不断得到以下错误之一: 或此错误: 最后一个错误表示它找不到名为“value”的列,该列包含数据框的值(熔化后)。 这是我的代码: 这是一个小数据示例。请注意,“变量”是一个总是被传递到group_by函数中的列,所以我决定将其硬编码。 如何编写此函数,使其接受group_

  • 问题内容: 我可以在R中使用以下代码在任何通用SQL数据库中选择不同的行。我会使用,但SQL语法不支持它。无论如何,这确实有效: 我一直在成功使用它,但是想知道如何在其他dplyr步骤之后传递相同的SQL查询,而不是像上面所示那样仅将其用作第一步。最好用一个例子来说明: 因此,我有两个SQL表,然后我要查看不同的行,并保留所有列。是否如上所述将SQL代码通过管道传递到R中(简单地利用该函数)?如果

  • 我正在尝试使用对每一行执行一个函数并创建一个考虑多列的新列,我最初使用的是,但速度非常慢。我希望我的自定义函数中的列列表是一个变量,但除非显式地列出变量名,否则无法使其工作。例如,这是可行的: 但如果我希望它使用列输入作为vars进行计算: