使用cbind结合gsub生成的对象时,为何所有值都被加引号?
问题:cbind合并字符向量与矩阵后所有值出现引号的原因?
这是个很典型的R中矩阵与数据框差异的问题,我来帮你拆解下:
首先还原你的操作场景:
你有一个数值矩阵perc,前几行输出如下:
head(perc) band perc_SC perc_SH perc_WH perc_Tot [1,] 1 0.009104271 0.6651940 0.3257017 1 [2,] 2 0.008963893 0.6289139 0.3621222 1 [3,] 3 0.008837757 0.6186107 0.3725515 1 [4,] 4 0.008495426 0.6395086 0.3519959 1 [5,] 5 0.008152846 0.6563294 0.3355178 1 [6,] 6 0.007516888 0.6615440 0.3309391 1
你执行了以下代码提取文件名并合并:
key <- names(B) country <- gsub("\\_.*","",key) perc1 <- cbind(country,perc)
结果发现perc1里所有值都带了引号,原因如下:
核心原因:矩阵的单一类型限制
R中的矩阵是同质数据结构——也就是说,它只能存储同一种数据类型(要么全是数值,要么全是字符)。你的country是字符向量,而perc是数值矩阵,当用cbind()合并时,R会自动将整个结果转换为字符矩阵:因为字符类型的优先级高于数值类型,所有原来的数值元素都被强制转换成了字符格式,所以输出时会显示引号。
解决方法:改用数据框存储
要同时保留字符和数值类型,你需要用数据框(data.frame)——这是R中用于存储异质数据的结构,不同列可以有不同类型。推荐两种简单的实现方式:
- 方式一:先将矩阵转为数据框,再合并
# 把数值矩阵转换为数据框 perc_df <- as.data.frame(perc) # 合并字符向量与数据框 perc1 <- cbind(country, perc_df)
- 方式二:直接用data.frame构造新对象
perc1 <- data.frame(country = country, perc)
用以上任意一种方法处理后,country列会保持字符类型,其他列保留数值类型,输出时就不会出现不必要的引号了。
内容的提问来源于stack exchange,提问作者Diego Moya
相关产品推荐
相关产品推荐

