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

从数据框提取单个值作为新列时列名被追加的问题排查

问题描述

我用read_excel读取了无列名的Excel文件,提取数据子集后,想把原数据中的单个值作为新列添加到子集里,但添加后新列名变成了x$...3、x2$...3的形式,即使执行重命名操作,$...3后缀依然存在,导致后续处理受阻。


操作代码及中间结果

读取数据并提取子集

data <- read_excel('PNL35.W1 Illumina DNA Prep Workbook_v16_NEW AGM_COVfixed.xlsx', col_names=FALSE)

excelsubset <- data[11:34, c(2,5, 13)]

head(excelsubset)
# A tibble: 6 × 3
  ...2         ...5        ...13
  <chr>        <chr>       <chr>
1 06B06899G-9  PRJNA514285 NA   
2 06B06899G-10 PRJNA514285 NA   
3 06B06899H-1  PRJNA514285 NA   
4 06B06899H-2  PRJNA514285 NA   
5 06B06899H-3  PRJNA514285 NA   
6 06B06899H-4  PRJNA514285 NA   

添加新列后的结果

# 尝试从data中提取单个值作为excelsubset的整列
excelsubset$x <- data[7,3]
excelsubset$x2 <- data[8,3]

head(excelsubset)
# A tibble: 6 × 5
  ...2         ...5        ...13 x$...3 x2$...3
  <chr>        <chr>       <chr> <chr>  <chr>  
1 06B06899G-9  PRJNA514285 NA    45483  BDS    
2 06B06899G-10 PRJNA514285 NA    45483  BDS    
3 06B06899H-1  PRJNA514285 NA    45483  BDS    
4 06B06899H-2  PRJNA514285 NA    45483  BDS    
5 06B06899H-3  PRJNA514285 NA    45483  BDS    
6 06B06899H-4  PRJNA514285 NA    45483  BDS  

重命名后的异常结果

colnames(excelsubset) <- c("Strain_ID", "Bioproject_ID", "Qubit_Reading", "Sequencing_Date", "Analyst_Sequencing")

head(excelsubset)
# A tibble: 6 × 5
  Strain_ID    Bioproject_ID Qubit_Reading Sequencing_Date$...3 Analyst_Sequencing$...3
  <chr>        <chr>         <chr>         <chr>                <chr>                  
1 06B06899G-9  PRJNA514285   NA            07/10/2024           BDS                     
2 06B06899G-10 PRJNA514285   NA            07/10/2024           BDS                     
3 06B06899H-1  PRJNA514285   NA            07/10/2024           BDS                     
4 06B06899H-2  PRJNA514285   NA            07/10/2024           BDS                     
5 06B06899H-3  PRJNA514285   NA            07/10/2024           BDS                     
6 06B06899H-4  PRJNA514285   NA            07/10/2024           BDS  

原因分析

因为read_excel默认返回tibble格式的数据,当你用data[7,3]提取值时,返回的不是单个标量,而是一个仅一行一列的tibble子对象。把这个子对象作为新列添加到excelsubset时,R会保留它原有的列名...3,所以显示为x$...3——这里的$...3并不是列名的一部分,而是表示你在引用子tibble中的...3列。重命名操作只能修改外层列名,内层子对象的列名不会被改变,因此显示时会一直带着这个后缀。


解决办法

核心是提取单个标量值而非tibble子对象,以下是几种可行方式:

方法1:用双括号[[直接提取元素

双括号可以直接定位到tibble中的单个值,返回标量:

excelsubset$x <- data[[7,3]]
excelsubset$x2 <- data[[8,3]]

方法2:使用dplyr的pull()函数

如果习惯用tidyverse工具,可以用slice()定位行,再用pull()提取值:

library(dplyr)
excelsubset$x <- data %>% slice(7) %>% pull(3)
excelsubset$x2 <- data %>% slice(8) %>% pull(3)

方法3:转换为普通数据框后提取

普通数据框用[行,列]提取会直接返回标量:

data_df <- as.data.frame(data)
excelsubset$x <- data_df[7,3]
excelsubset$x2 <- data_df[8,3]

使用以上任意一种方法添加新列后,再执行重命名操作,就不会出现$...3的后缀了。


内容的提问来源于stack exchange,提问作者Greg Deiulio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:58:09