如何解决使用带有字符列表的数据框列作为 for 循环中函数的变量名称,将结果放入变量中
我想知道如何使用带有字符列表的数据框列作为 for 循环中函数的变量名,将结果放入变量中。
我想使用 mtcars
数据集变量 mpg
、drat
、disp
作为 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 举报,一经查实,本站将立刻删除。