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

在变异中粘贴变量名(dplyr)

吴飞语
2023-03-14

我尝试在mutate_()函数(dplyr)中用paste()创建一个变量。

我试图用这个答案修改代码(dplyr-mutate:使用动态变量名),但它不起作用...

注意:nameVarPeriod1是函数的参数。

nameVarPeriod1=A2
df <- df %>%
    group_by(segment) %>%
    mutate_((.dots=setNames(mean(paste0("Sum",nameVarPeriod1)), paste0("MeanSum",nameVarPeriod1))))
Warning message:
In mean.default(paste0("Sum", nameVarPeriod1)) :
  argument is not numeric or logical: returning NA
df <- df %>%
    group_by(segment) %>%
    mutate(mean=mean(SumA2))
structure(list(segment = structure(c(5L, 1L, 4L, 2L, 2L, 14L, 
11L, 6L, 14L, 1L), .Label = c("Seg1", "Seg2", "Seg3", "Seg4", 
"Seg5", "Seg6", "Seg7", "Seg8", "Seg9", "Seg10", "Seg11", "Seg12", 
"Seg13", "Seg14"), class = "factor"), SumA2 = c(107584.9, 127343.87, 
205809.54, 138453.4, 24603.46, 44444.39, 103672, 88695.8, 64400, 
36815.82)), .Names = c("segment", "SumA2"), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

共有1个答案

柴瀚昂
2023-03-14

DPLYR 0.7.0以后不需要使用mutate_。下面是一个使用:=动态分配变量名和助手函数quo name的解决方案。

阅读小插曲(“programming”,“dplyr”)了解更多信息会很有帮助。对于旧版本的DPLYR,请参见在'DPLYR'中使用动态变量名。

df <- df %>%
  group_by(segment) %>%
  mutate( !!paste0('MeanSum',quo_name(nameVarPeriod1)) := 
mean(!!as.name(paste0('Sum',quo_name(nameVarPeriod1)))))

使用DPLYR 1.0.0中新的across函数,我们可以使用glue样式语法设置名称,并且可以将函数名和原始列作为名称的一部分:

my_fn <- function(nameVarPeriod1 = 'A2'){
  col_list <- paste0('Sum',nameVarPeriod1)
  df %>% 
    group_by(segment) %>%
    mutate(across(col_list, list(mean=mean), .names = "{fn}{col}"))
}

my_fn()
#   segment   SumA2 meanSumA2
#   <fct>     <dbl>     <dbl>
# 1 Seg5    107585.   107585.
# 2 Seg1    127344.    82080.
# 3 Seg4    205810.   205810.
# 4 Seg2    138453.    81528.
# 5 Seg2     24603.    81528.
# 6 Seg14    44444.    54422.
# 7 Seg11   103672    103672 
# 8 Seg6     88696.    88696.
# 9 Seg14    64400     54422.
#10 Seg1     36816.    82080.
 类似资料:
  • 我正在构建一个闪亮的应用程序,用户可以通过编辑DT:表中的选定行来更新数据库中的表。 问题是,当dt:表有很多列(比如25列)时,这个过程可能会很耗时。所以我想知道是否有一种很好且有效的方法将下面查询中的“VAL”变量与dataframe列链接起来? 下面的代码正在运行,但由于我的DT:table有60多列,我真的无法坚持这个解决方案(

  • 问题内容: 我有几个字段,每个字段都是这样的: 通过使用带有计数器的循环,我希望能够说出fieldx。其中x是该循环中计数器的值。这意味着如果我的数组中有6个条目,则将为fields1-field6提供值。 是否可以使用fieldx? 问题答案: 您可以使用反射来完成此操作,但是通常最好在数组中声明字段。代替: 你可以这样做: 然后,您可以遍历数组来设置值:

  • 我面临以下问题:我必须给成千上万的图形用户界面元素命名。如果它能像这样工作,那就太好了: 如果我能将元素的名称设置为“Classname.myMenuItem”,那就太好了。 是否有任何方法来获取变量的名称(变量名称ofc,而不是JMenuItem.getName())?

  • 如何使像这样打印: 在调试过程中,我曾在许多地方将许多打印语句作为日志编写。我会写这样的声明 我想要一个打印变量名和变量值的方法。在C中,可以按如下方式进行: 有什么办法可以做到这一点吗? 提前感谢。

  • 我想使用在数据帧中创建多个新列。列名及其内容应动态生成。 来自IRIS的示例数据: 我创建了一个函数来从变量中更改新列:

  • 我想从传递的几个值动态调用几个“setter”方法。每个方法都将具有字符串,int...要设置的变量类型(例如:setUserName(String userName)或setUserAge(int age))。 在我的例子中,我有一个setter方法“setUse_status(int use_stats)”,我无法配置getDeclaredMethod方法工作。似乎在获取方法时,classVa