Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态dplyr列名计算_R_Dynamic_Dplyr - Fatal编程技术网

动态dplyr列名计算

动态dplyr列名计算,r,dynamic,dplyr,R,Dynamic,Dplyr,我有以下代码 colName被传入。我一直试图将它作为colName的值进行评估,但没有取得太大的成功。我尝试过使用“eval”、“setNames”等,但仍然没有成功 本质上,如果my colName=“mycl”,我希望dplyr链的执行就像最后一行读取: mutate(MyCol=ifelse(is.na(MyCol),“BLANK”,MyCol)) makeSummaryTable% 摘要(numObs=n())%>% 解组()%>% 排列(desc(numObs))%>% 行() mu

我有以下代码

colName被传入。我一直试图将它作为colName的值进行评估,但没有取得太大的成功。我尝试过使用“eval”、“setNames”等,但仍然没有成功

本质上,如果my colName=“mycl”,我希望dplyr链的执行就像最后一行读取:

mutate(MyCol=ifelse(is.na(MyCol),“BLANK”,MyCol))

makeSummaryTable%
摘要(numObs=n())%>%
解组()%>%
排列(desc(numObs))%>%
行()
mutate(colName=ifelse(is.na(colName),“BLANK”,colName))
返回(结果)
}

以下是如何使用dplyr 0.6.0,使用新的
tidyeval
方法进行非标准评估。(我不确定是否有可能进行标准评估,至少是以一种直截了当的方式):

库(dplyr)
makeSummaryTable%
排列(描述(n))%>%
变异(
old_col=!!colName,
!!quo_name(colName):=if_else(is.na(!!colName),“BLANK”!!colName)
)
}
makeSummaryTable(头发颜色,星球大战)
#>#A tibble:13 x 3
#>头发颜色和旧颜色
#>                      
#>1无37无
#>2棕色18棕色
#>3黑色13黑色
#>4空白5
#>5白4白
#>6金黄色3金黄色
#>7奥本1奥本
#>8赤褐色,灰色1赤褐色,灰色
#>9赤褐色,白色1赤褐色,白色
#>10个金发女郎1个金发女郎
#>11棕色,灰色1棕色,灰色
#>12灰色1灰色
#>13未知1未知
enquo
将不带引号的列名转换为称为quosure的奇特对象<代码>然后取消对quosure的引号,这样就可以像直接在函数中键入一样对其进行计算。有关更深入和准确的解释,请参见哈德利的

EDIT:我意识到最初的问题是使用用户提供的
colName
值命名新列,而不仅仅是
colName
,因此我更新了答案。要实现这一点,需要使用
quo_name
将quosure转换为字符串(或标签)。然后,可以使用
“取消引用”就像常规问答一样。唯一需要注意的是,由于R不能使表达式的开头或结尾发生突变(!!foo=bar)
tidyeval
引入了新的定义操作符
:=
(用户可能熟悉
data.table
,在那里它有一些不同的用法)。与传统的赋值运算符
=
不同,
:=
运算符允许在右侧和左侧取消引用


(更新了答案,以使用一行中有
NA
的数据帧,以说明最后一行
变异
有效。我还使用了
计数
而不是
分组依据
+
汇总
,并删除了不必要的
)下面介绍如何使用dplyr 0.6.0,使用新的
tidyeval
方法进行非标准评估。(我不确定是否有可能进行标准评估,至少是以一种直截了当的方式):

库(dplyr)
makeSummaryTable%
排列(描述(n))%>%
变异(
old_col=!!colName,
!!quo_name(colName):=if_else(is.na(!!colName),“BLANK”!!colName)
)
}
makeSummaryTable(头发颜色,星球大战)
#>#A tibble:13 x 3
#>头发颜色和旧颜色
#>                      
#>1无37无
#>2棕色18棕色
#>3黑色13黑色
#>4空白5
#>5白4白
#>6金黄色3金黄色
#>7奥本1奥本
#>8赤褐色,灰色1赤褐色,灰色
#>9赤褐色,白色1赤褐色,白色
#>10个金发女郎1个金发女郎
#>11棕色,灰色1棕色,灰色
#>12灰色1灰色
#>13未知1未知
enquo
将不带引号的列名转换为称为quosure的奇特对象<代码>
然后取消对quosure的引号,这样就可以像直接在函数中键入一样对其进行计算。有关更深入和准确的解释,请参见哈德利的

EDIT:我意识到最初的问题是使用用户提供的
colName
值命名新列,而不仅仅是
colName
,因此我更新了答案。要实现这一点,需要使用
quo_name
将quosure转换为字符串(或标签)。然后,可以使用
“取消引用”就像常规问答一样。唯一需要注意的是,由于R不能使表达式的开头或结尾发生突变(!!foo=bar)
tidyeval
引入了新的定义操作符
:=
(用户可能熟悉
data.table
,在那里它有一些不同的用法)。与传统的赋值运算符
=
不同,
:=
运算符允许在右侧和左侧取消引用

(更新了答案,以使用一行中有
NA
的数据帧,以说明最后一行
变异
有效。我还使用了
计数
而不是
分组依据
+
汇总
,并删除了不必要的

makeSummaryTable <- function(colName,originalData){
  result <- originalData %>% 
    group_by_(colName) %>% 
    summarise(numObs = n()) %>% 
    ungroup() %>% 
    arrange(desc(numObs)) %>% 
    rowwise() %>% 
    mutate_(colName = ifelse(is.na(colName), "BLANK",colName))
  return(result)
}