1 读入数据
针对不同的数据格式,有不同的数据读取方法
1.1 csv格式
- 针对csv文件,直接read_csv。
- 注意fileEncoding是说编码,win系统下为GBK,更常见的是utf-8。
- stringsAsFactors = F是个很好用的技巧,避免后面为因子型变量去麻烦。
house = read.csv("./data/二手房.csv",fileEncoding = "GBK",stringsAsFactors = F)
head(house)
CATE | bedrooms | halls | AREA | floor | subway | school | price | LONG | LAT | NAME | DISTRICT |
---|
chaoyang | 1 | 0 | 46.06 | middle | 1 | 0 | 4.8850 | 116.4597 | 39.92835 | 10AM新坐标 | 方庄 |
chaoyang | 1 | 1 | 59.09 | middle | 1 | 0 | 4.6540 | 116.4597 | 39.92835 | 10AM新坐标 | 方庄 |
haidian | 5 | 2 | 278.95 | high | 1 | 1 | 7.1662 | 116.3036 | 39.95481 | 10号名邸 | 紫竹桥 |
haidian | 3 | 2 | 207.00 | high | 1 | 1 | 5.7972 | 116.3036 | 39.95481 | 10号名邸 | 紫竹桥 |
fengtai | 2 | 1 | 53.32 | low | 1 | 1 | 7.1268 | 116.4188 | 39.94381 | 17号旁门 | 蒲黄榆 |
fengtai | 2 | 1 | 58.00 | low | 1 | 1 | 7.0690 | 116.4188 | 39.94381 | 17号旁门 | 蒲黄榆 |
1.2 xlsx格式
- 针对xls或者xlsx文件,需要先导入一个包:readxl
- 然后用函数read_excel
library(readxl)
movie2=read_excel("./data/电影数据.xlsx")
tail(movie2)
name | boxoffice | doubanscore | type | duration | showtime | director | star1 | index1 | star2 | index2 |
---|
大唐玄奘 | 3271.44 | 5.1 | 剧情 | 90 | 2016/4/29 | 霍建起 | 黄晓明 | 32595 | 徐峥 | 10318 |
我的特工爷爷 | 32009.37 | 5.3 | 动作 | 99 | 2016/4/1 | 洪金宝 | 洪金宝 | 9148 | 刘德华 | 30277 |
火锅英雄 | 36624.84 | 7.3 | 犯罪 | 95 | 2016/4/1 | 杨庆 | 陈坤 | 5763 | 白百何 | 10585 |
百鸟朝凤 | 8686.14 | 8.0 | 剧情 | 108 | 2016/5/6 | 吴天明 | 陶泽如 | 1139 | 李岷城 | 3290 |
夜孔雀 | 3260.42 | 4.7 | 爱情 | 84 | 2016/5/20 | 戴思杰 | 刘亦菲 | 58355 | 刘烨 | 11248 |
钢刀 | 924.86 | 4.3 | 动作 | 94 | 2016/5/20 | 阿甘 | 何润东 | 11822 | 李学东 | 521 |
1.3 txt文件
针对txt文件,要考虑两种情况:数据为结构化的还是非结构化的。
- 结构化:指txt中已经是很规范的数据,类似DataFrame,则直接read_table
movie = read.table("./data/电影.txt", header = TRUE) # 编码是utf-8的
head(movie)
name | boxoffice | doubanscore | type | duration | showtime | director | star1 | index1 | star2 | index2 |
---|
叶问3 | 77060.44 | 6.4 | 动作 | 105 | 2016/3/4 | 叶伟信 | 甄子丹 | 11385 | 张晋 | 4105 |
美人鱼 | 338583.26 | 6.9 | 喜剧 | 93 | 2016/2/8 | 周星驰 | 邓超 | 41310 | 林允 | 9292 |
女汉子真爱公式 | 6184.45 | 4.5 | 喜剧 | 93 | 2016/3/18 | 郭大雷 | 赵丽颖 | 181979 | 张翰 | 44277 |
西游记之孙悟空三打白骨精 | 119956.51 | 5.7 | 喜剧 | 120 | 2016/2/8 | 郑保瑞 | 郭富城 | 12227 | 巩俐 | 8546 |
澳门风云三 | 111693.89 | 4.0 | 喜剧 | 112 | 2016/2/8 | 王晶 | 周润发 | 16731 | 刘德华 | 30277 |
功夫熊猫3 | 99832.53 | 7.7 | 喜剧 | 95 | 2016/1/29 | 吕寅荣 | 杰克布莱克 | 178 | 安吉丽娜朱莉 | 1540 |
- 非结构化:通常是文本数据,这样直接就readlines 按行读取
yitian=readLines("./data/倚天屠龙记.txt")
head(yitian)
- ' 一 天涯思君不可忘'
- ' “春游浩荡,是年年寒食,梨花时节。白锦无纹香烂漫,玉树琼苞堆雪。静夜沉沉,'
- '浮光霭霭,冷浸溶溶月。人间天上,烂银霞照通彻。浑似姑射真人,天姿灵秀,意气殊高'
- '洁。万蕊参差谁信道,不与群芳同列。浩气清英,仙才卓荦,下土难分别。瑶台归去,洞'
- '天方看清绝。”'
- ' 作这一首《无俗念》词的,乃南宋末年一位武学名家,有道之士。此人姓丘,名处机'
2 好用的函数
2.1 revalue函数
- 就是需要把多个类别合并 不用写逻辑语句了 直接revalue一下
df = movie
table(df$type)
剧情 动作 喜剧 爱情 犯罪
3 4 8 3 1
# 例子1
# install.packages('dplyr')
# library(dplyr)
df$type <- revalue(df$type,
c('剧情' = '真-剧情', '动作' = '真-动作',
'喜剧' = '真-喜剧', '爱情' = '真-爱情',
,'犯罪' = '真-犯罪'))
head(df)
2.2 rep函数
# 例子2
# 还是打标签,不过这次是没有标签的时候 上面是标签都有了需要去汇总整理——使用rep函数
df["diff_type"] <- rep("正常电影", dim(df)[1])
head(df)
name | boxoffice | doubanscore | type | duration | showtime | director | star1 | index1 | star2 | index2 | diff_type |
---|
叶问3 | 77060.44 | 6.4 | 动作 | 105 | 2016/3/4 | 叶伟信 | 甄子丹 | 11385 | 张晋 | 4105 | 正常电影 |
美人鱼 | 338583.26 | 6.9 | 喜剧 | 93 | 2016/2/8 | 周星驰 | 邓超 | 41310 | 林允 | 9292 | 正常电影 |
女汉子真爱公式 | 6184.45 | 4.5 | 喜剧 | 93 | 2016/3/18 | 郭大雷 | 赵丽颖 | 181979 | 张翰 | 44277 | 正常电影 |
西游记之孙悟空三打白骨精 | 119956.51 | 5.7 | 喜剧 | 120 | 2016/2/8 | 郑保瑞 | 郭富城 | 12227 | 巩俐 | 8546 | 正常电影 |
澳门风云三 | 111693.89 | 4.0 | 喜剧 | 112 | 2016/2/8 | 王晶 | 周润发 | 16731 | 刘德华 | 30277 | 正常电影 |
功夫熊猫3 | 99832.53 | 7.7 | 喜剧 | 95 | 2016/1/29 | 吕寅荣 | 杰克布莱克 | 178 | 安吉丽娜朱莉 | 1540 | 正常电影 |
2.3 ifelse函数
- 对某一列数据进行处理的时候,需要二值化,如果值为空或者大于小于等于某个值则为多少,否则为多少。
table(df$type)
df$type <- ifelse(df$type == '', '缺失',
df$type)
head(df)
- 对于ifelse 自己还写了一个加强版的:即多值化的方法。
- 【补充知识】dim(data)返回data的行和列 dim(data)[1]为行
for(i in 1:dim(df)[1])
{
if(nchar(df[i,8])==16){
df[i,8] = '信用卡'
}else if (nchar(df[i,8])>=17 && nchar(df[i,8])<=19){
df[i,8] = '借记卡'
} else if (nchar(df[i,8])<16 | nchar(df[i,8])>19){
df[i,8] = '其他'
}
}
总结:
- nchar函数是统计字符的个数 8表示相应的列
- &&表示且 而|表示或
2.4 mode函数
mode(df$doubanscore)
‘numeric’
2.5 cut函数
- 对一个变量进行切割分组,特别是数值型变量,有个好用的函数
df$doubanscore <- cut(df$doubanscore,
breaks = c(0, 5, 7, max(df$doubanscore)),
labels = c('<5', '5-7', '>=7'))
head(df)
name | boxoffice | doubanscore | type | duration | showtime | director | star1 | index1 | star2 | index2 | diff_type |
---|
叶问3 | 77060.44 | 5-7 | 动作 | 105 | 2016/3/4 | 叶伟信 | 甄子丹 | 11385 | 张晋 | 4105 | 正常电影 |
美人鱼 | 338583.26 | 5-7 | 喜剧 | 93 | 2016/2/8 | 周星驰 | 邓超 | 41310 | 林允 | 9292 | 正常电影 |
女汉子真爱公式 | 6184.45 | <5 | 喜剧 | 93 | 2016/3/18 | 郭大雷 | 赵丽颖 | 181979 | 张翰 | 44277 | 正常电影 |
西游记之孙悟空三打白骨精 | 119956.51 | 5-7 | 喜剧 | 120 | 2016/2/8 | 郑保瑞 | 郭富城 | 12227 | 巩俐 | 8546 | 正常电影 |
澳门风云三 | 111693.89 | <5 | 喜剧 | 112 | 2016/2/8 | 王晶 | 周润发 | 16731 | 刘德华 | 30277 | 正常电影 |
功夫熊猫3 | 99832.53 | >=7 | 喜剧 | 95 | 2016/1/29 | 吕寅荣 | 杰克布莱克 | 178 | 安吉丽娜朱莉 | 1540 | 正常电影 |
2.6 aggerate函数
# 计算不同类型电影的票房中位数
df_cal <- aggregate(df$boxoffice, by = list(type = df$type), median)
df_cal
type | x |
---|
剧情 | 8058.15 |
动作 | 18135.76 |
喜剧 | 89086.96 |
爱情 | 12561.55 |
犯罪 | 36624.84 |
2.7 detach函数
卸载包
detach("package:ipred")
2.8 重命名函数
colnames(df)[1] <- 'movie_name'
head(df)
movie_name | boxoffice | doubanscore | type | duration | showtime | director | star1 | index1 | star2 | index2 | diff_type |
---|
叶问3 | 77060.44 | 5-7 | 动作 | 105 | 2016/3/4 | 叶伟信 | 甄子丹 | 11385 | 张晋 | 4105 | 正常电影 |
美人鱼 | 338583.26 | 5-7 | 喜剧 | 93 | 2016/2/8 | 周星驰 | 邓超 | 41310 | 林允 | 9292 | 正常电影 |
女汉子真爱公式 | 6184.45 | <5 | 喜剧 | 93 | 2016/3/18 | 郭大雷 | 赵丽颖 | 181979 | 张翰 | 44277 | 正常电影 |
西游记之孙悟空三打白骨精 | 119956.51 | 5-7 | 喜剧 | 120 | 2016/2/8 | 郑保瑞 | 郭富城 | 12227 | 巩俐 | 8546 | 正常电影 |
澳门风云三 | 111693.89 | <5 | 喜剧 | 112 | 2016/2/8 | 王晶 | 周润发 | 16731 | 刘德华 | 30277 | 正常电影 |
功夫熊猫3 | 99832.53 | >=7 | 喜剧 | 95 | 2016/1/29 | 吕寅荣 | 杰克布莱克 | 178 | 安吉丽娜朱莉 | 1540 | 正常电影 |
2.9 round函数
# 法1
df$boxoffice <- round(df$boxoffice, 1)
head(df)
movie_name | boxoffice | doubanscore | type | duration | showtime | director | star1 | index1 | star2 | index2 | diff_type |
---|
叶问3 | 77060.4 | 5-7 | 动作 | 105 | 2016/3/4 | 叶伟信 | 甄子丹 | 11385 | 张晋 | 4105 | 正常电影 |
美人鱼 | 338583.3 | 5-7 | 喜剧 | 93 | 2016/2/8 | 周星驰 | 邓超 | 41310 | 林允 | 9292 | 正常电影 |
女汉子真爱公式 | 6184.4 | <5 | 喜剧 | 93 | 2016/3/18 | 郭大雷 | 赵丽颖 | 181979 | 张翰 | 44277 | 正常电影 |
西游记之孙悟空三打白骨精 | 119956.5 | 5-7 | 喜剧 | 120 | 2016/2/8 | 郑保瑞 | 郭富城 | 12227 | 巩俐 | 8546 | 正常电影 |
澳门风云三 | 111693.9 | <5 | 喜剧 | 112 | 2016/2/8 | 王晶 | 周润发 | 16731 | 刘德华 | 30277 | 正常电影 |
功夫熊猫3 | 99832.5 | >=7 | 喜剧 | 95 | 2016/1/29 | 吕寅荣 | 杰克布莱克 | 178 | 安吉丽娜朱莉 | 1540 | 正常电影 |
2.10 %>%函数
ratio2 <- aggregate(df$boxoffice, by = list(type = df$type), median) %>% as.data.frame()
ratio2
type | x |
---|
剧情 | 8058.1 |
动作 | 18135.8 |
喜剧 | 89086.9 |
爱情 | 12561.5 |
犯罪 | 36624.8 |
top10_refuse <- table(df$type) %>% as.data.frame()
top10_refuse
Var1 | Freq |
---|
剧情 | 3 |
动作 | 4 |
喜剧 | 8 |
爱情 | 3 |
犯罪 | 1 |