R语言数据框列存在却提示对象未找到的问题求助
问题描述
使用R语言dplyr包的unite()函数生成数据框subj_means_index_Acc后,确认所有变量均存在,但调用mutate()进一步处理时出现错误:! object 'inverted_facing' not found,尝试用rename()重命名变量也失败,已排除未创建变量和拼写错误的情况。
数据框输出
> subj_means_index_Acc # A tibble: 100 × 7 # Groups: subject, site, category [100] subject site category `inverted_facing ` inverted_nonFacing `upright _facing ` `upright _nonFacing` <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> 1 P01 EBA "chairs " 0.875 0.969 0.969 1 2 P01 EBA "targets" 0.656 0.75 0.906 1 3 P01 OPA "chairs " 0.969 1 0.906 0.969 4 P01 OPA "targets" 0.469 0.688 0.906 0.969 5 P02 EBA "chairs " 0.906 0.875 0.938 0.906 6 P02 EBA "targets" 0.812 0.812 0.906 0.938 7 P02 OPA "chairs " 0.938 0.781 0.875 0.938 8 P02 OPA "targets" 0.781 0.906 0.875 0.906 9 P03 EBA "chairs " 0.719 0.938 0.906 0.781 10 P03 EBA "targets" 0.938 0.844 0.969 0.938 # … with 90 more rows
用到的代码
subj_means_index_Acc <- subjmeans_condition %>% select(subject, site, category, orientation, direction, mAcc) %>% unite("condition", orientation, direction) %>% spread(condition, mAcc) subj_means_index_Acc <- subj_means_index_Acc %>% mutate(inv_eff_facing = (1-inverted_facing) - (1-upright_facing), inv_eff_nonfacing =(1-inverted_nonFacing) - (1-upright_nonFacing)) %>% mutate(inv_eff_fac_nf = inv_eff_facing - inv_eff_nonfacing)
问题原因
核心问题是变量名包含多余空格或格式异常:
- 从数据框输出可见,部分变量名如
inverted_facing(末尾带多个空格)、upright _facing(中间+末尾带空格),而你在mutate()中调用的是无空格的inverted_facing,R会将带空格和不带空格的变量名视为完全不同的对象,因此提示找不到。 - 该问题根源是
unite()合并orientation和direction列时,原始列内容本身带有空格,导致生成的condition列值包含空格,后续spread()直接将这些带空格的字符串作为变量名。
解决方法
方法1:在unite()阶段提前清理空格
修改unite()代码,先清理原始列的空格,再生成标准格式的合并列:
library(stringr) subj_means_index_Acc <- subjmeans_condition %>% select(subject, site, category, orientation, direction, mAcc) %>% # 清理orientation和direction列的首尾空格 mutate(across(c(orientation, direction), str_trim)) %>% # 用下划线合并为无空格的condition列 unite("condition", orientation, direction, sep = "_", remove = TRUE) %>% spread(condition, mAcc)
生成的变量名会是inverted_facing、upright_facing这类标准格式,后续mutate()可直接调用。
方法2:清理现有数据框的变量名
若不想重新生成数据框,直接用rename_with()批量清理所有变量名的首尾空格:
subj_means_index_Acc <- subj_means_index_Acc %>% rename_with(str_trim)
清理后再运行原mutate()代码即可。
方法3:调用带空格的变量时用反引号包裹
临时调试时,可将带空格的变量名用反引号(`)包裹,完全匹配变量名的空格情况:
subj_means_index_Acc <- subj_means_index_Acc %>% mutate(inv_eff_facing = (1-`inverted_facing `) - (1-`upright _facing `), inv_eff_nonfacing =(1-inverted_nonFacing) - (1-`upright _nonFacing`)) %>% mutate(inv_eff_fac_nf = inv_eff_facing - inv_eff_nonfacing)
此方法仅适合临时使用,不推荐长期依赖。
内容的提问来源于stack exchange,提问作者Eva Balgova
相关产品推荐
相关产品推荐

