You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:24:32