微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用带有字符列表的数据框列作为 for 循环中函数的变量名称,将结果放入变量中

如何解决使用带有字符列表的数据框列作为 for 循环中函数的变量名称,将结果放入变量中

我想知道如何使用带有字符列表的数据框列作为 for 循环中函数的变量名,将结果放入变量中。

我想使用 mtcars 数据集变量 mpgdratdisp 作为 DV,然后从中生成均值。

我创建了一个只有这些名称作为列的数据框:

mtcars_DVs <- data.frame(c("mpg","drat","disp"))
names(mtcars_DVs)[names(mtcars_DVs) == "c..mpg....drat....disp.."] <- "Variable_name"
mtcars_DVs$Variable_name <- as.character(mtcars_DVs$Variable_name)

我想在被调用Variable_means 中创建一列,使用这些 DV 的平均值,使用 for 循环引用 mtcars_DVs$Variable_name 作为用于创建平均值的对象的名称。>

输出是一种不起作用的方法

> mtcars_DVs$Variable_means <- 
+   for (DV_col in mtcars_DVs$Variable_name) 
+   {
+     (mean(mtcars$DV_col))
+   }
Warning messages:
1: In mean.default(mtcars$DV_col) :
  argument is not numeric or logical: returning NA
2: In mean.default(mtcars$DV_col) :
  argument is not numeric or logical: returning NA
3: In mean.default(mtcars$DV_col) :
  argument is not numeric or logical: returning NA

这个输出是另一种不起作用的方法

> mtcars_DVs$Variable_means <- 
+   for (DV_col in mtcars_DVs$Variable_name) 
+   {
+     (mean(as.name(mtcars$DV_col)))
+   }
Error in h(simpleError(msg,call)) : 
  error in evaluating the argument 'x' in selecting a method for function 'mean': invalid type/length (symbol/0) in vector allocation

一个不成功的输出

> mtcars_DVs$Variable_means <- 
+   for (DV_col in mtcars_DVs$Variable_name) 
+   {
+     (mean(get(mtcars$DV_col)))
+   }
Error in h(simpleError(msg,call)) : 
  error in evaluating the argument 'x' in selecting a method for function 'mean': invalid first argument

我可以这样做很长的路要走,但这很耗时,而且不能自我引用:

# generates means
> mean(mtcars$mpg)
[1] 20.09062
> mean(mtcars$drat)
[1] 3.596563
> mean(mtcars$disp)
[1] 230.7219

# inputs means
> mtcars_DVs$Variable_means <- c("20.09062","3.596563","230.7219")

# displays data
> mtcars_DVs
  Variable_name Variable_means
1           mpg       20.09062
2          drat       3.596563
3          disp       230.7219

请帮忙。我很高兴转换方法

解决方法

我们可以遍历列“Variable_name”,从数据中提取 ccolumn 作为 vector[[ 并得到 mean

mtcars_DVs$Variable_means <- sapply(mtcars_DVs$Variable_name,function(nm) mean(mtcars[[nm]]))

在对象上使用 $ 从字面上检查列名“DV_col”,而不是

mtcars[[DV_col]]

另外,for 循环中的赋值是

mtcars_DVs$Variable_means <- numeric(nrow(mtcars_DVs))
for(i in seq_along(mtcars_DVs$Variable_name)) {
         mtcars_DVs$Variable_means[i] <-  
                 mean(mtcars[[mtcars_DVs$Variable_name[i]]])
 } 

mtcars_DVs
#  Variable_name Variable_means
#1           mpg      20.090625
#2          drat       3.596563
#3          disp     230.721875

此外,还有向量化的 colMeans,所以我们可以这样做

mtcars_DVs$Variable_means <- colMeans(mtcars[mtcars_DVs$Variable_name])

或者使用 dplyr/tidyr

library(dplyr)
library(tidyr)
 mtcars %>% 
   summarise(across(all_of(mtcars_DVs$Variable_name),mean)) %>% 
   pivot_longer(everything(),names_to = 'Variable_name',values_to = 'Variable_means')
 # A tibble: 3 x 2
 #  Variable_name Variable_means
 # <chr>                  <dbl>
 #1 mpg                    20.1 
 #2 drat                    3.60
 #3 disp                  231.  

或者用collapse

library(collapse)
qTBL(fmean(get_vars(mtcars,mtcars_DVs$Variable_name)),keep.attr = TRUE,row.names.col = 'Variable_name')
# A tibble: 3 x 2
#  Variable_name      X
#  <chr>          <dbl>
#1 mpg            20.1 
#2 drat            3.60
#3 disp          231.  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。