Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.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
R 将列表传递给函数参数?_R_Loops_Dplyr_Purrr - Fatal编程技术网

R 将列表传递给函数参数?

R 将列表传递给函数参数?,r,loops,dplyr,purrr,R,Loops,Dplyr,Purrr,大图:我希望我的用户定义函数像循环一样遍历参数列表(或向量)。(在本例中,参数是字符串) get\u avg2警告的平均值。默认值(~“防御等级”,na.rm=TRUE):参数不是数字 #>或者合乎逻辑:返回NA #>`summary()`解组输出(用`.groups`参数重写) #>平均值警告。默认值(~“处理等级”,na.rm=TRUE):参数不是数字 #>或者合乎逻辑:返回NA #>平均值警告。默认值(~“处理等级”,na.rm=TRUE):参数不是数字 #>或者合乎逻辑:返回NA #>`

大图:我希望我的用户定义函数像循环一样遍历参数列表(或向量)。(在本例中,参数是字符串)

get\u avg2警告的平均值。默认值(~“防御等级”,na.rm=TRUE):参数不是数字
#>或者合乎逻辑:返回NA
#>`summary()`解组输出(用`.groups`参数重写)
#>平均值警告。默认值(~“处理等级”,na.rm=TRUE):参数不是数字
#>或者合乎逻辑:返回NA
#>平均值警告。默认值(~“处理等级”,na.rm=TRUE):参数不是数字
#>或者合乎逻辑:返回NA
#>`summary()`解组输出(用`.groups`参数重写)
#>平均值警告。默认值(~“覆盖率等级”,na.rm=TRUE):参数不正确
#>数字或逻辑:返回NA
#>平均值警告。默认值(~“覆盖率等级”,na.rm=TRUE):参数不正确
#>数字或逻辑:返回NA
#>`summary()`解组输出(用`.groups`参数重写)
数据样本以平均值表示警告。默认值(~“防御等级”,na.rm=TRUE):参数不是数字
#>或者合乎逻辑:返回NA
#>平均值警告。默认值(~“防御等级”,na.rm=TRUE):参数不是数字
#>或者合乎逻辑:返回NA
#>`summary()`解组输出(用`.groups`参数重写)
#>平均值警告。默认值(~“处理等级”,na.rm=TRUE):参数不是数字
#>或者合乎逻辑:返回NA
#>平均值警告。默认值(~“处理等级”,na.rm=TRUE):参数不是数字
#>或者合乎逻辑:返回NA
#>`summary()`解组输出(用`.groups`参数重写)
#>平均值警告。默认值(~“覆盖率等级”,na.rm=TRUE):参数不正确
#>数字或逻辑:返回NA
#>平均值警告。默认值(~“覆盖率等级”,na.rm=TRUE):参数不正确
#>数字或逻辑:返回NA
#>`summary()`解组输出(用`.groups`参数重写)

这感觉像是一个非常简单的操作——从一个数据帧计算组平均值并将其绑定到另一个数据帧——这并不是我正在努力解决的问题。我想让我的函数自动遍历一系列参数。我希望能够快速地构建变量列表(或向量-我不打算使用列表),并将其作为参数传递给函数,以便它使用我提供给它的变量构建一个数据框架。但是我接受这样的观点:我在概念上有一些错误,我应该使用循环、purr、map等,或者改变我函数的编写方式?

你的独立示例和你传递列表的函数之间的区别是——在独立示例中,你传递的是不带引号的变量(
get_avg2(Talk_Grade)
)然而,当传递向量/列表时,传递的是带引号的变量。(
variable\u list你尝试过
unlist
?你是什么意思?我应该在哪里尝试?你的函数在tidyverse中似乎是一种相当复杂的方式,就像基本函数
ave
所做的那样。我从未使用过该函数,但它看起来像是专为处理因子而设计的,而我的分组类别是一个字符?会吗如果我只是将我的角色转换为因子并运行它,是否有效?@Spence\p是的。它应该直接与角色一起工作,尽管这是一个非常全面的答案。我肯定在概念上与NSE进行斗争。非常感谢!!!!!我认为使用Cross的最后一个解决方案可能有效,但“等级”变量..只有大约6个,我还有另外50多个列都有唯一类型的名称。所以我排除了使用带有样式的_。我可以用Cross()解决这个问题的另一种方法是什么?你可以用模式或任何特定的正则表达式传递列名。(
以('Grade')结尾。
)或者你也可以将其作为列号传递,即
cols我很抱歉打扰你,试图理解-所以我会在这个序列之前分配cols,然后在“Grade”现在的位置调用它?是的,所以
cols
在之前分配,然后在
中使用它,比如
数据样本%>%groupby(Name)%>%summary(跨(cols,mean,na.rm=TRUE))
Wow,行得通!非常感谢!!我唯一的问题是分配“cols”时需要零索引。在这个例子中,当我试图设置
cols时
get_avg2 <- function(v_name) {

avg <- "_Average"      

data_1 <-  PFF_College_Defense_data %>% 
  dplyr::group_by(Name) %>% 
  dplyr::summarise("{{ v_name }}_{avg}" := mean({{ v_name }}, na.rm = TRUE))

PFF_NCAA_Average_grades <- merge(PFF_NCAA_Average_grades, data_1, by = "Name")

return(PFF_NCAA_Average_grades)

}


v_names <- list("hits", "tackles", "forced_fumbles")

for (i in v_names) {

get_avg2(i)

}
#didn't work

PFF_NCAA_Average_grades <- purrr::map_df(v_names, get_avg2)

#didnt' work

PFF_NCAA_Average_grades <- get_avg2(hits)

PFF_NCAA_Average_grades <- get_avg2(tackles)

PFF_NCAA_Average_grades <- get_avg2(forced_fumbles)


library(tidyverse)

data_sample <- data.frame(
  Name = c("Dalton Campbell", "Dalton Campbell", "Dalton Campbell", "Andre Walker", "Andre Walker", "Andre Walker"),
  Defense_Grade = c(88, 86, 92, 94, 97, 95),
  Tackle_Grade = c(66, 69, 72, 74, 76, 78),
  Coverage_Grade = c(44, 43, 44, 76, 73, 78)
)

#Here I set up the dataframe which the function will bind to 
data_sample_averages <-  data_sample %>% 
  group_by(Name) %>% 
  dplyr::summarise(Defense_Grade_Average = mean(Defense_Grade))
#> `summarise()` ungrouping output (override with `.groups` argument)


#Function which computes average of variable (the only argument) and merges it back to data_sample_averages
get_avg2 <- function(v_name) {
  
  avg <- "_Average"      
  
  data_1 <-  data_sample %>% 
    dplyr::group_by(Name) %>% 
    dplyr::summarise("{{ v_name }}_{avg}" := mean({{ v_name }}, na.rm = TRUE))
  
  data_sample_averages <- merge(data_sample_averages, data_1, by = "Name")
  
  return(data_sample_averages)

}

#This works - it computers the average of Tackle_Grade and binds it to data_sample_averages
data_sample_averages <- get_avg2(Tackle_Grade)
#> `summarise()` ungrouping output (override with `.groups` argument)

#shows you the averages
print(data_sample_averages)
#>              Name Defense_Grade_Average Tackle_Grade__Average
#> 1    Andre Walker              95.33333                    76
#> 2 Dalton Campbell              88.66667                    69


#Neither of these work - this is where I'm stuck
variable_list <- list("Defense_Grade", "Tackle_Grade", "Coverage Grade")

data_sample_averages <- lapply(variable_list, get_avg2)
#> Warning in mean.default(~"Defense_Grade", na.rm = TRUE): argument is not numeric
#> or logical: returning NA

#> Warning in mean.default(~"Defense_Grade", na.rm = TRUE): argument is not numeric
#> or logical: returning NA
#> `summarise()` ungrouping output (override with `.groups` argument)
#> Warning in mean.default(~"Tackle_Grade", na.rm = TRUE): argument is not numeric
#> or logical: returning NA
#> Warning in mean.default(~"Tackle_Grade", na.rm = TRUE): argument is not numeric
#> or logical: returning NA
#> `summarise()` ungrouping output (override with `.groups` argument)
#> Warning in mean.default(~"Coverage Grade", na.rm = TRUE): argument is not
#> numeric or logical: returning NA
#> Warning in mean.default(~"Coverage Grade", na.rm = TRUE): argument is not
#> numeric or logical: returning NA
#> `summarise()` ungrouping output (override with `.groups` argument)

data_sample_averages <- purrr::map(variable_list, get_avg2)
#> Warning in mean.default(~"Defense_Grade", na.rm = TRUE): argument is not numeric
#> or logical: returning NA
#> Warning in mean.default(~"Defense_Grade", na.rm = TRUE): argument is not numeric
#> or logical: returning NA
#> `summarise()` ungrouping output (override with `.groups` argument)
#> Warning in mean.default(~"Tackle_Grade", na.rm = TRUE): argument is not numeric
#> or logical: returning NA
#> Warning in mean.default(~"Tackle_Grade", na.rm = TRUE): argument is not numeric
#> or logical: returning NA
#> `summarise()` ungrouping output (override with `.groups` argument)
#> Warning in mean.default(~"Coverage Grade", na.rm = TRUE): argument is not
#> numeric or logical: returning NA
#> Warning in mean.default(~"Coverage Grade", na.rm = TRUE): argument is not
#> numeric or logical: returning NA
#> `summarise()` ungrouping output (override with `.groups` argument)

library(dplyr)

get_avg2 <- function(v_name) {
  avg <- "_Average"      
  data_1 <-  data_sample %>% 
    dplyr::group_by(Name) %>% 
    dplyr::summarise(!!paste0(v_name, avg):=mean(.data[[v_name]], na.rm = TRUE))
  data_sample_averages <- merge(data_sample_averages, data_1, by = "Name")
  
  return(data_sample_averages)
  
}
get_avg2("Tackle_Grade")

#             Name Defense_Grade_Average Tackle_Grade_Average
#1    Andre Walker              95.33333                   76
#2 Dalton Campbell              88.66667                   69
variable_list <- c("Defense_Grade", "Tackle_Grade", "Coverage_Grade")
lapply(variable_list, get_avg2)

#[[1]]
#             Name Defense_Grade_Average.x Defense_Grade_Average.y
#1    Andre Walker                95.33333                95.33333
#2 Dalton Campbell                88.66667                88.66667

#[[2]]
#             Name Defense_Grade_Average Tackle_Grade_Average
#1    Andre Walker              95.33333                   76
#2 Dalton Campbell              88.66667                   69

#[[3]]
#             Name Defense_Grade_Average Coverage_Grade_Average
#1    Andre Walker              95.33333               75.66667
#2 Dalton Campbell              88.66667               43.66667
data_sample %>%
  group_by(Name) %>%
  summarise(across(ends_with('Grade'), mean, na.rm = TRUE))

#.   Name            Defense_Grade Tackle_Grade Coverage_Grade
#  <chr>                   <dbl>        <dbl>          <dbl>
#1 Andre Walker             95.3           76           75.7
#2 Dalton Campbell          88.7           69           43.7