【发布时间】:2021-01-09 14:52:00
【问题描述】:
我正在尝试在 for 循环中使用动态变量来访问表名。 SO 上的其他问题(例如here、here 和here)似乎与使用动态变量访问列名有关。我正在使用 R v4.0.3 和 dplyr v1.0.2。
基本上,我从 .sav (SPSS) 文件导入,并试图将 400 多列拆分为较小的数据框,其中包含每个调查问题的信息。这部分有效,但我想做一些事情,比如为每个新数据框添加一个平均列。我目前正在尝试在分段 for 循环中执行此操作,但我无法使其正常工作。 (我也很乐意为另一个 for 循环或列表或其他内容中的每个新数据帧单独执行此操作,但如果我无法让另一个工作,我也看不出这将如何工作!)
稍微简化一下,原始文件中的列被命名为 QX.Y_Z,其中 Z 是 X 块中问题 Y 中的项目。
一些虚拟数据,设置2个问题的(sav-type)数据框,每个问题有两个项目:
mydata=tibble(Q6.1_1_1=as.numeric(c(2, 1, 3, 1, 2, 3, 1, 3, 2, 1, 1, 1, 2, 2)),
Q6.1_1_2=as.numeric(c(1, 3, 1, 1, 1, 2, 3, 3, 1, 3, 1, 1, 1, 2)),
Q7.1_1_1=as.numeric(c(1, 2, 1, 2, 1, 3, 3, 1, 2, 3, 2, 1, 3, 2)),
Q7.1_1_2=as.numeric(c(3, 1, 3, 1, 2, 1, 3, 2, 3, 1, 3, 1, 1, 3)),
)
var_label(mydata$Q6.1_1_1)<-"Rate your effort - before."
var_label(mydata$Q6.1_1_2)<-"Rate your effort - before."
var_label(mydata$Q7.1_1_1)<-"Rate your enthusiasm - before."
var_label(mydata$Q7.1_1_2)<-"Rate your enthusiasm - after."
val_labels(mydata$Q6.1_1_1)<-c(Low=1, Medium=2, High=3)
val_labels(mydata$Q6.1_1_2)<-c(Low=1, Medium=2, High=3)
val_labels(mydata$Q7.1_1_1)<-c(Low=1, Medium=2, High=3)
val_labels(mydata$Q7.1_1_2)<-c(Low=1, Medium=2, High=3)
mydata
# A tibble: 14 x 4
Q6.1_1_1 Q6.1_1_2 Q7.1_1_1 Q7.1_1_2
<dbl+lbl> <dbl+lbl> <dbl+lbl> <dbl+lbl>
1 2 [Medium] 1 [Low] 1 [Low] 3 [High]
2 1 [Low] 3 [High] 2 [Medium] 1 [Low]
3 3 [High] 1 [Low] 1 [Low] 3 [High]
4 1 [Low] 1 [Low] 2 [Medium] 1 [Low]
5 2 [Medium] 1 [Low] 1 [Low] 2 [Medium]
6 3 [High] 2 [Medium] 3 [High] 1 [Low]
7 1 [Low] 3 [High] 3 [High] 3 [High]
8 3 [High] 3 [High] 1 [Low] 2 [Medium]
9 2 [Medium] 1 [Low] 2 [Medium] 3 [High]
10 1 [Low] 3 [High] 3 [High] 1 [Low]
11 1 [Low] 1 [Low] 2 [Medium] 3 [High]
12 1 [Low] 1 [Low] 1 [Low] 1 [Low]
13 2 [Medium] 1 [Low] 3 [High] 1 [Low]
14 2 [Medium] 2 [Medium] 2 [Medium] 3 [High]
从问题字符串中删除项目编号:
varlist<-mydata %>%
colnames() %>%
as_tibble() %>%
separate(value, "qno", sep="_", extra = "drop", fill="right") %>%
unique() %>%
pull()
> varlist
[1] "Q6.1" "Q7.1"
生成子表:
for (v in varlist) {
assign(paste0("table", v), select(mydata, matches(v)))
}
这给了我称为 tableQ6.1 和 tableQ7.1 的子表。到目前为止,一切顺利。
但是,当我尝试在生成每个子表时为其添加平均列(给出每行的平均值)时,我找不到告诉 mutate() 使用动态名称的方法桌子。这些是我尝试过的几个选项,但我得到的(包括这些以及更多)都是错误,所以我一定遗漏了一些明显的东西:
for (v in varlist) {
assign(paste0("table", v), select(mydata, matches(v)))
tabname<-sym(paste0("table", v))
mutate({{tabname}}, mean=rowMeans(across(where(is.numeric)), na.rm = FALSE))
}
for (v in varlist) {
assign(paste0("table", v), select(mydata, matches(v)))
tabname<-"table{v}" %>%
mutate("mean{v}":=rowMeans(across(where(is.numeric)), na.rm = FALSE))
}
欢迎任何指导(包括关于这是否是最佳方法的更广泛的 cmets)!
【问题讨论】: