类别数据
用sample函数随机生成调查表
> opinion<-sample(c("赞成","反对"),20,replace = TRUE) > home<-sample(c("社区A","社区B","社区C"),10,replace = TRUE) > sex<-sample(c("男","女"),20,replace = TRUE) > myinfo<-data.frame("社区"=home,"性别"=sex,"态度"=opinion) > myinfo 社区 性别 态度 1 社区B 女 赞成 2 社区B 男 赞成 3 社区C 女 赞成 4 社区B 女 反对 5 社区B 女 反对 6 社区B 男 反对 7 社区B 男 赞成 8 社区C 女 反对 9 社区C 男 反对 10 社区A 女 赞成 11 社区B 男 赞成 12 社区B 女 反对 13 社区C 女 赞成 14 社区B 男 赞成 15 社区B 男 赞成 16 社区B 女 反对 17 社区B 女 赞成 18 社区C 女 反对 19 社区C 女 赞成 20 社区A 男 反对
这里涉及三个类别变量:社区、性别和态度
简单频数表:也称为一维列联表
summary函数:生成频数分布表
> summary(myinfo) 社区 性别 态度 社区A: 2 男: 8 反对: 9 社区B:12 女:12 赞成:11 社区C: 6
table函数:生成频数分布表
prop.table:转为百分比表
> table(myinfo$态度) 反对 赞成 9 11
> prop.table(table(myinfo$态度))*100 反对 赞成 45 55
二维列联表:两个类别变量交叉分类形成的频数分布表
addmargins函数:为表格加上边际和
> table(myinfo$性别,myinfo$态度) 反对 赞成 男 3 5 女 6 6 > addmargins(table(myinfo$性别,myinfo$态度)) 反对 赞成 Sum 男 3 5 8 女 6 6 12 Sum 9 11 20
CrossTable函数:生成二维列联表并进行百分比分析
多维列联表:涉及两个以上类别变量
ftable函数:col.var的默认值为最后一个类别
> ftable(myinfo,row.vars = c("性别","态度"),col.var = "社区") 社区 社区A 社区B 社区C 性别 态度 男 反对 1 1 1 赞成 0 5 0 女 反对 0 4 2 赞成 1 2 3
数值数据
生成数值数据频数分布表时要先将其转换为类别数据
随机产生一组数值数据:
> myvector<-sample(160:280,120) [1] 201 182 188 177 186 260 190 250 233 228 182 168 275 257 [15] 230 202 183 254 237 243 215 173 205 236 245 211 230 253 [29] 259 165 198 242 271 179 173 227 226 171 239 266 263 201 [43] 175 257 179 261 270 220 237 186 249 225 188 241 272 226 [57] 223 189 240 247 216 180 255 257 204 273 274 235 269 166 [71] 167 218 194 249 219 247 169 213 181 214 196 173 241 253 [85] 224 167 195 258 216 249 275 251 262 219 243 219 251 266 [99] 196 232 225 275 232 188 200 265 200 227 241 227 203 191 [113] 212 246 206 219 253 240 241 175
数据分组:本例中分为 12组,组距为10
round_any函数:这个没有查到太多,本例中为计算不同组别的频数
as.numeric函数:将对象转化为数值向量
cumsum函数:累计数
paste函数:用于字符串连接,写了一篇专门的博客讲paste函数的基础用法,感觉和python的join用法相似
round函数:指定小数精度
> count<-table(round_any(myvector,10,floor)) #计算不同组别的数值总数 > count 160 170 180 190 200 210 220 230 240 250 260 270 6 9 11 7 9 12 11 10 16 13 8 8 > count<-as.numeric(count) #得到频数的类别变量 > count [1] 6 9 11 7 9 12 11 10 16 13 8 8 > pcount<-prop.table(count)*100 #得到百分比的类别变量 > cumsump<-cumsum(pcount) #得到累计百分比的类别变量 > cumsump [1] 5.00000 12.50000 21.66667 27.50000 35.00000 45.00000 54.16667 62.50000 75.83333 [10] 86.66667 93.33333 100.00000 > name<-paste(seq(160,270,by=10),"-",seq(170,280,by=10),sep="") #字符串连接,获取行名 > name [1] "160-170" "170-180" "180-190" "190-200" "200-210" [6] "210-220" "220-230" "230-240" "240-250" "250-260" [11] "260-270" "270-280" > gt<-data.frame("频数"=count,"百分比"=pcount,"累计百分比"=cumsump,row.names=name) > round(gt,4) 频数 百分比 累计百分比 160-170 6 5.0000 5.0000 170-180 9 7.5000 12.5000 180-190 11 9.1667 21.6667 190-200 7 5.8333 27.5000 200-210 9 7.5000 35.0000 210-220 12 10.0000 45.0000 220-230 11 9.1667 54.1667 230-240 10 8.3333 62.5000 240-250 16 13.3333 75.8333 250-260 13 10.8333 86.6667 260-270 8 6.6667 93.3333 270-280 8 6.6667 100.0000
cut函数:对数据进行分组
cut(x,beraks,right=TRUE,dig.lab=3,...)
breaks=k*(x1:x2) k为组的间隔,k*x1为下限,k*x2为上限,right为是否封闭上限。
> d<-table(cut(myvector,breaks=10*(16:28),right = FALSE)) > d [160,170) [170,180) [180,190) [190,200) [200,210) [210,220) 6 9 11 7 9 12 [220,230) [230,240) [240,250) [250,260) [260,270) [270,280) 11 10 16 13 8 8 > df<-data.frame(d) > df Var1 Freq 1 [160,170) 6 2 [170,180) 9 3 [180,190) 11 4 [190,200) 7 5 [200,210) 9 6 [210,220) 12 7 [220,230) 11 8 [230,240) 10 9 [240,250) 16 10 [250,260) 13 11 [260,270) 8 12 [270,280) 8 > percent<-df$Freq/sum(df$Freq)*100 > cumsump<-cumsum(percent) > mytable<-data.frame(d,percent,cumsump) > mytable Var1 Freq percent cumsump 1 [160,170) 6 5.000000 5.00000 2 [170,180) 9 7.500000 12.50000 3 [180,190) 11 9.166667 21.66667 4 [190,200) 7 5.833333 27.50000 5 [200,210) 9 7.500000 35.00000 6 [210,220) 12 10.000000 45.00000 7 [220,230) 11 9.166667 54.16667 8 [230,240) 10 8.333333 62.50000 9 [240,250) 16 13.333333 75.83333 10 [250,260) 13 10.833333 86.66667 11 [260,270) 8 6.666667 93.33333 12 [270,280) 8 6.666667 100.00000