如何在R中从零构建与table()行为一致的frequency table
问题:手动构建与
table()生成的频率表行为一致的对象 需求是直接指定频率值构建频率表(无需从大数据集生成),但手动用matrix转换得到的fromScratch表,虽然显示内容和table()生成的fromTable一致,调用plot()时结果却完全不同。
原生成方式与问题代码
从数据集生成的表:
fromTable <- table(votes$candidate_pct)
输出:
fromTable 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 10 19 20 24 30 47 62 59 65 45 59 31 28 26 25 17 18
手动构建的问题代码:
data <- matrix(c(10,19,20,24,30,47,62,59,65,45,59,31,28,26,25,17,18), ncol = 17, byrow = TRUE ) colnames(data) = c("0.54","0.55","0.56","0.57","0.58","0.59","0.6","0.61","0.62","0.63","0.64","0.65","0.66","0.67","0.68","0.69","0.7") rownames(data) = "" fromScratch = as.table(data)
问题原因
table()生成的是一维table对象,而用matrix转换得到的是二维table对象(包含一个空行名的额外维度)。plot()函数对一维和二维table的渲染逻辑完全不同:一维table会生成以类别为横轴、频率为纵轴的柱状图,而二维table会按行列维度生成分组或矩阵式的可视化,因此结果差异极大。
正确构建方法
方法1:直接基于命名向量生成一维table
这是最直接的方式,和table()生成的结构完全一致:
# 定义频率值和对应的类别名称 freq_vec <- c(10,19,20,24,30,47,62,59,65,45,59,31,28,26,25,17,18) names(freq_vec) <- c("0.54","0.55","0.56","0.57","0.58","0.59","0.6","0.61","0.62","0.63","0.64","0.65","0.66","0.67","0.68","0.69","0.7") # 转换为一维table fromScratch <- as.table(freq_vec)
方法2:将现有二维matrix转换为一维table
如果已经有matrix格式的数据,可以先转成一维向量再转table:
# 将二维matrix转为一维向量,再指定名称 fromScratch <- as.table(as.vector(data)) names(fromScratch) <- colnames(data)
验证结构
用str()查看对象结构,正确的一维table输出应为:
'table' int [1:17(1d)] 10 19 20 24 30 47 62 59 65 45 ... - attr(*, "dimnames")=List of 1 ..$ : chr [1:17] "0.54" "0.55" "0.56" "0.57" ...
此时调用plot(fromScratch)就能得到和plot(fromTable)完全一致的柱状图。
内容的提问来源于stack exchange,提问作者Anne Eve
相关产品推荐
相关产品推荐

