从数据框提取单个值作为新列时列名被追加的问题排查
问题描述
我用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
相关产品推荐
相关产品推荐

