01R入门

向量
A <- c(1:3)
B <- seq(from=,to=,by=)
D <- rep(0,5)

append 插入数据
replace() 替换

A <- c(1:10)
A[-3] 删除第3个元素
A[-c(7,8)] 删除位置7,8的元素

sum() 和
max() 最大值
min() 最小值
range() 取值范围
mean() 平均值
var() 方差

sort() 从小到大排序
rev() 反排序
rev(sort()) 从大到小

prod() 乘积
prod(1:n) 阶乘

矩阵操作
rm(list=ls()) 清空内存

Mat <- matrix(c(1:12),nrow=3,ncol=4)
dim() 维数获取
* 矩阵与标量相乘
%*% 矩阵与矩阵相乘

满足矩阵相乘的条件

矩阵索引
提取行
提取列
提取部分行列
元素筛选
逻辑判断
which

apply(mat,1,f)
apply(mat,2,f)

数组
创建 Arr <- array(data,dim)
元素调用

列表
是一种复杂的数据结构,可以包含不同类型的数据

元素访问
列表索引:顺序,$
绑定列表:attach()
转化为向量:unlist()

计算操作
lapply() 返回一个列表
sapply() 返回一个向量或矩阵

数据框
Data Frame一般译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同的数据类型,而Matrix是必须相同的,Data Frame每一列有列名,每一行也可以指定行名,如果不指定行名,那么就是从1开始自增的Sequence来标识每一行。
应用最多的数据类型
dat <- data.frame()
访问 索引,$
添加新列
查询 查询满足条件的记录
矩阵-->数据框 as.data.frame()

连接 merge()
合并 rbind() cbind()
lapply() sapply()

因子
factor(x=character(), levels, labels=levels, exclude=NA, ordered=is.ordered(x), nmax=NA)
levels 用来指定因子可能的水平(缺省值是向量x中互异的值)
labels 用来指定水平的名字
exclude 表示从向量x中剔除的水平值

as.vector() 转化为向量
ordered()
cut()
tapply()


可以求相应组合的频率,组合就是变量的因子水平的所有组合
table()

基本运算
+-*/ 加减乘除
%% %/% 余数,整除
abs() 绝对值
sign() 判断正负
^ sqrt() 幂,指数,平方根
log2()
log10()
log(c,base=) 自定义底数的对数
log(a,base=exp(1)) 自然常数e的对数

比较计算
==,>,<,!=,<=,>=,isTRUE,identical

NULL 空值
NA 缺失值

累积计算
cumsum() 累加
cumprod() 累乘

seq() 产生序列
unique() 找出相异的
which()
%in%

三角函数计算
sin() cos() tan()
作用对象可以是标量也可以是向量,因为R语言的函数式编程,作用对象一般是向量

解方程
f <- function(x,a,b){return(a*x + b)}
uniroot(f,c(-10,10),5,10,tol=0.0001)
f(-10)<0
f(10)>0

f <- matrix(c(3,5,1,2),nrow=2,byrow=TRUE)
rf <- matrix(c(4,1),nrow=2)
result <- solve(f,rf)

for循环
依次取出一个可迭代数据对象

a <- c('a','b','c')
for(i in a){...}

下标访问
元素访问

for(i in a)
​   for (j in b)
​       {...}

while循环
控制程序流程,执行满足条件语句,结束程序

s <- 0
l <- 1
while(i<=100){
  s <- s + i
  i <- i +1
}

repeat循环
主要用来重复执行任务,达到条件终止

s <- 0
i <- 1
repeat{
  s <- s + i
  i <- i + 1
  if(i > 100){
    break()
  }
}

函数简介
关键字function,形参,是否返回值组成
定义

f <- function(x){
​   语句;
​   return value
}

调用 f(x)

R语言管道函数应用
%>%,管道操作,其意思是将%>%左边的对象传递给右边的函数
%>%来自dplyr包的管道函数,我们可以将其理解为车间里的流水线,经过前一步加工的产品能进入后一步进一步加工
将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存

a %>% f(b)等同于f(a,b)
b %>% f(a,.,c)等同于f(a,b,c)

函数递归
一种计算过程,如果其中每一步都要用到前一步或前几步的结果

f <- function(){
​   if(expre){return/break
}
f()
}

调用 f()


install.packages() 安装
library() 加载包
remove.packages() 卸载

帮助
help.start()
help(package=)
help(函数名)
??包名
?函数名
example(函数名)

基本可视化绘图
plot(x,y,...)
type 画图类型
main 标题
xlab,ylab 坐标轴标题
col 颜色

barplot(height,...)
names.arg 变量名
legend.text 变量标签
horiz 是否垂直

hist(x,...)
freq 是否画频率分布直方图

pie()
labels 标签
radius 半径

boxplot()
notch 是否有缺口
names 变量名

par(mfrow(2,2)) 开一个2*2的窗口

qplot()作图
ggplot2包
qplot(x,y,data)
colour 颜色
shape 形状
alpha=I(1/10) 大小
geom point,boxplot,line,bar

批量生成保存图片

txt文件读取
种类 空格逗号制表符隔开
read.table(file,sep,header)
file 文件路径
sep 分隔符
header 第一行是否是数据

txt文件写入
write.table(data,file,sep)
可以保存成任意符号分割文件

csv文件
逗号分隔的一种表格数据(用的最多)
read.csv(file,header)
file 文件路径
header 第一行是否是数据
write.csv(data,file)

xlsx文件
xlsx包
依赖包rjava 需要安装java编译环境
安装jdk 安装rjava 安装xlsx

dat <- read.xlsx('df.xlsx',sheetIndex=1)
write.xlsx(dat,'test.xlsx')

sample用法
sample(x,size,replace=F)
x可以是任何对象
size规定了从对象中抽出多少个数,size应该小于x的规模,否则会报错
replace默认是F,表示每次抽取后的数就不能在下一次抽取;T表示抽取过的数可以继续拿来被抽取

排序函数
sort(x.decreasing=FALSE) 默认返回升序后的序列
order(x,decreasing=FALSE) 默认返回升序后的序列在原始序列的下标
order(-x) 降序排列

apply函数
R语言中的以apply()函数为首的apply()家族,提供了强大而方便的循环功能
apply
作用于向量

x <- cbind(3, c(1:5, 4:1))
apply(x,1,mean)

真实对于一个三维数组,第二个参数取3表示对第三维分别应用指定函数。比如:
x <- array(c(1:24),dim=c(2,3,4))
apply(x,3,mean)

lapply
apply()函数主要是对向量进行循环,而lapply()函数则在对列表元素进行循环时特别有用
x <- list(a1=c(1:8),a2=c(TRUE,FALSE,FALSE,TRUE,TRUE))
lapply(x,mean)
lapply(x,quantile)

sapply
sapply(x,quantile)
这里用sapply()函数也指定quantile求出了x的分位数,与lapply()函数不同的是,sapply()函数默认返回的是一个矩阵,而lapply()函数返回的是一个列表

tapply()
a <- as.factor(c(1,1,2,3,3))
tapply(a,a,length)

随机数
正态分布随机数
服从正态分布的随机数
rnorm(n,mean=0,sd=1)

如果想要生成一个长度为10的向量,向量中的每个值服从标准正态分布,那么可以这样写
rnorm(10)

一般正态分布
rnorm(10,mean,sd)

均匀分布随机数
服从均匀分布的随机数
runif(n,min=0,max=1)

生成一个长度为10的向量,向量中的每个值服从0-1区间上的均匀分布,那么可以这样写
runif(10)

一般随机数函数
runif(n,min,max)

一行代码找出众数
as.numeric(names(table(a))[table(a) == max(table(a))])

source的妙用
source('函数文件')

自带数据集大汇总
向量
euro 欧元汇率,长度为11,每个元素都有命名
landmasses 48个陆地的面积,每个都有命名
precip 长度为70的命名向量
rivers 北美141条河流长度
state.abb 美国50个州的双字母缩写
state.area 美国50个州的面积
state.name 美国50个州的全称

因子
state.division 美国50个州的分类,9个类别
state.region 美国50个州的地理分类

矩阵,数组
euro.cross 11种货币的汇率矩阵
freeny.x 每个季度影响收入四个因素的记录
state.x77 美国50个州的八个指标
USPersonalExpenditure 5个年份在5个消费方向的数据
VADeaths 1940年弗吉尼亚州死亡率(每千人)
volcano 某火山区的地理信息(10米*10米的网格)
WorldPhones 8个区域在7个年份的电话总数
iris3 3种鸢尾花形态数据
Titanic 泰坦尼克乘员统计
UCBAdmissions 伯克利分校1973年院系,录取和性别的频数
crimtab 3000个男性罪犯左手中指长度和身高关系
HairEyeColor 952人头发颜色,眼睛颜色和性别的频数
occupationalStatus 英国男性父子职业联系

类矩阵
eurodist 欧洲12个城市的距离矩阵,只有下三角部分
Harman23.cor 305个女孩八个形态指标的相关系数矩阵
Harman74.cor 145个儿童14个心理指标的相关系数矩阵

数据框
airquality 纽约1973年5-9月每日空气质量
anscombe 四组x-y数组,虽有相似的统计量,但实际数据差别较大
attenu 多个观测站对加利福尼亚23次地震的观测数据
attitude 30个部门在七个方面的调查结果,调查结果是同一部门35个职员赞成的百分比
beaver1 一只海狸每10分钟的体温数据,共114条数据
beaver2 另一只海狸每10分钟的体温数据,共100条数据
BOD 随水质的提高,生化反应对氧的需求(mg/l)随时间(天)的变化
cars 1920年代汽车速度对刹车距离的影响
chickwts 不同饮食种类对小鸡生长速度的影响
esoph 法国的一个食管癌病理对照研究
faithful 一个间歇泉的爆发时间和持续时间
Formaledehyde 两种方法测定甲醛浓度时分光光度计的读数
Freeny 每季度收入和其他四因素的记录
dating from 配对的病例对照数据,用于条件logistic回归
InsectSparays 使用不同杀虫剂的昆虫数目
iris 3种鸢尾花形态数据
LifeCycleSavings 50个国家的存款率
longley 强共线性的宏观经济数据
morley 光速测量试验数据
mtcars 32辆汽车在11个指标上的数据
OrchardSprays 使用拉丁方设计研究不同喷雾剂对蜜蜂的影响
PlanGrowth 三种处理方式对植物产量的影响

列表
state.center 美国50个州中心的经度和纬度

类数据框
ChickWeight 饮食对鸡生长的影响
CO2 耐寒植物CO2提取的差异
DNase 若干次试验中,DNase浓度和光密度的关系
Indometh 某药物的药物动力学数据
Loblolly 火炬松的高度,年龄和种源
Orange 桔子树生长数据
Theoph 茶碱药动学数据

时间序列数据
airmiles 美国1937-1960年客运里程营收(实际售出机位乘以飞行里数)
AirPassengers Box&Jenkins航空公司1949-1960年每月国际航线乘客数
austres 澳大利亚1971-1994每季度人口数(以千为单位)
BJsales 有关销售的一个时间序列
BJsales.lead 前一指标的先行指标(leading indicator)
CO2 1959-1997年每月大气CO2浓度(ppm)
discoveries 1860-1959年每年巨大发现或发明的个数
ldeaths 1974-1979年英国每月支气管炎,肺气肿和哮喘的死亡率
fdeaths 前述死亡率的女性部分
mdeaths 前述死亡率的男性部分
freeny.y 每季度收入
JohnsonJohnson 1960-1980年每季度Johnson&Johnson股票的红利
LakeHuron 1875-7972年某一湖泊水位的记录
lh 黄体生成素水平,10分钟测量一次
lynx 1821-1934年加拿大猞猁数据
nhtemp 1912-1971年每年平均温度
Nile 1871-1970尼罗河流量
nottem 1920-1939每月大气温度
presidents 1945-1974年每季度美国总统支持率
UKDriverDeaths 1969-1984年每月英国司机死亡或严重伤害的数目
uspop 1790-1970美国每十年一次的人口总数(百万为单位)
WWWusage 每分钟网络连接数
Seatbelts 多变量时间序列,和UKDriverDeaths时间段相同,反映更多因素
EuStockMarkets 多变量时间序列,欧洲股市四个主要指标的每个工作日记录,共1860条记录

关于包
data(package='包名')
data(package=.packages(all.available=TRUE))

数据转换
基本数据转换
as.character(x)
as.complex(x)
as.numeric(x)或者as.double(x)
as.integer(x)
as.logical(x)

非0都为TRUE

R代码调试
进入调试浏览器时,命令提示符从">"变为"Browse[d]>"("d"表示函数调用链深度)
n(next) 执行一行,然后暂停,直接键入"Enter"一样
c(continue) 如果在循环中,会执行本次循环剩下所有语句,然后进入下一次循环,到该位置继续暂停
键入变量名 查看变量值,若与浏览器变量同名,需用print()打印出来看
where 显示到达当前位置过程中函数的调用序列
Q 该命令会退出浏览器,返回正常交互模式

debug(函数名)
与debug()函数在函数f()入口处进入浏览器而处于调试状态不同,browser()可以插在函数中任一行,程序只要运行到该行,就进入调试状态即浏览器会被打开,直到程序结束
假如我们想观察这个累加运算过程变量i,s的变化,可以把browser()加到循环中,每循环一次,暂停一次,便于观察

数据探索
度量数据的集中程度
均值 mean()
中位数 median()
分位数 quantile()

度量数据集的分散程度
极值 range()
方差 var()
标准差 sd()

数值摘要表
summary()函数

缺失值处理
complete.cases(a) 返回一个逻辑向量
complete.cases(a,b)
na.omit() 直接返回去除含有缺失值所在行后的数据

缺失值填充
线性回归 首先查看不同列之间的相关系数,然后挑出那些与含有缺失值的列最相似的列,接着含有缺失值的列看作因变量,将其他与之最相关列作为自变量,构建回归方程,最后根据回归方程对缺失值进行预测型填补

计算相关性
构建回归模型 (lm(y~x))
带入回归模型预测

数据标准化
回归,主成分,因子分析等
数据标准化主要功能就是消除变量间的量纲关系,从而使数据具有可比性

最小-最大规范化(线性变换)
标准化后的数据范围为0<=y<=1,可以取值0和1,分别当x取最值的时候。这是一个线性变换,因为它本身就是一个线性关系式

z-score规范化
这是用每个数据首先减去均值再除以标准差,处理后序列正负值的分布反映了数据的丰度偏度。比如数据处理后序列负值居多,表明数据小于均值较多,那么均值水平就是为数不多的几个异常较大的值撑起来的。这种方法最常见,用的最多

对数logistic模式

线性回归
线性关系确定:相关系数,散点图
找出两个变量之间的线性关系,进而通过一个变量预测另外一个变量
iris数据集
标准化 scale()
模型拟合 lm(pw~sl)

多元线性回归
通常采用经典的最小二乘法,因为这样算出的确实是最优的系数,可以保证残差平方和最小的优化目标
iris数据集
标准化 scale()
模型拟合 lm()
残差图,QQ图 plot()

主成分分析
降维简化计算和模型,主成分分析是一种经典的数据降维方法,要求被分析的变量之间具有相关性,否则就失去主成分分析的原有意义
构建原始数据矩阵
消除量纲--数据标准化
建立协方差矩阵(就是相关系数矩阵)
求出特征值,特征向量
根据方差,累积方差贡献率确定主成分个数
求出综合得分,给出现实意义的解释

数据经过标准化后,其实协方差与相关系数矩阵是完全一样的,因为数据经过标准化后方差是1,而协方差与相关系数就相差一个是否除以两个方差
swiss数据集
标准化 scale()
构建模型 princomp()
确定主成分个数 screeplot()
使用predict()函数根据前面构建的主成分模型计算每个变量分别在主成分上的得分
特征值 eigen()
计算最终得分

正则表达式
通常被用来检索,替换那些符合某个模式(规则)的文本

常用匹配模式
\d 任何一个数字字符
\D 任何一个非数字字符
\w 任何一个数字或者字母,下划线,相当于[a-zA-Z0-9]
\W 任何一个非数字或者字母
\\ 转义字符
. 匹配任何一个字符
| 可选择匹配任意一个
^ 以特定模式开头或者表示逻辑非
$ 放在末尾,表示特定的结尾模式
() 提取匹配的字符串
[] 里面的表示可选
{} 表达式重复次数
* 匹配0次或者1次以上
+ 匹配1次以上
? 匹配0次或者1次

主要函数
字符串分割函数 strsplit()
字符串连接函数 paste()及paste0()
计算字符串长度 nchar()及length()
字符串截取函数 substr()及substring()

常用函数
grep(p,x) 存在参数value,返回结果是匹配项的下标
grepl(p,x) 存在返回TRUE
sub(p,replace,x) 对查找到的第一个进行替换
gsub() 对查找到的所有内容进行替换,返回替换后的text,否则直接返回text

stringr包
使用正则表达式的函数
str_extract(x,pattern) 提取首个匹配模式的字符
str_extract_all() 提取所有匹配模式的字符
str_locate(x,pattern) 返回首个匹配模式的字符的位置
str_locate_all() 返回所有匹配模式的字符的位置
str_replace(x,pattern,replace) 替换首个匹配模式
str_replace_all() 替换所有匹配模式
str_split(x,pattern) 按照模式分割字符串
str_split_fixed() 按照模式将字符串分割成指定个数
str_count(s,pattern) 返回指定模式出现的次数
str_sub(x,start,end) 提取指定位置字符
str_dup(x,times) 重复字符串
str_length(x) 返回字符的长度
str_trim() 丢弃填充,如去掉字符前后的空格
str_c() 连接字符

Rwordseg文本分词
若要机器对文本进行理解,就需要对文本进行分词,进而变成机器可以理解的单个词语,在处理大量文档的时候,还需要进行词语向量化,进而进行后面的文本挖掘统计
是一个处理中文文本的包
依赖包rjava

暂时加到内存里面 InsertWords()
删除临时加入词库的词 deleteWords()
分词操作 segmentCN()

安装词典
installDict(dictpath,dictname,dicttype=c("text","scel"),load=TRUE)
dictname 自定义词典的名称(英文)
dicttype 默认txt
load 表示安装后是否自动加载到内存,默认是TRUE

listDict() 显示安装的词典
uninstallDict() 删除安装的词典
insertWord()和deleteWord()函数 在内存中临时添加或删除词汇

jieba文本分词
在处理大量文档的时候,需要进行词语向量化,进而进行后面的文本挖掘计算
支持最大概率法,隐式马尔科夫模型,索引模型,混合模型,同时有词性标注,关键词提取,文本Simhash相似度比较等功能

包 jiebaR
建立分词引擎 seg <- worker()
词性标注 seg2 <- worker('tag')

关键词提取
关键词提取所使用的逆向文本频率(IDF)文本语料库可以切换成自定义语料库的路径,使用方法与分词类似。topn参数为关键词的个数
seg3 <- worker('keywords', topn=1)

前程无忧网站分析
rvest包

解决局部变量问题

神经网络
一种运算模型,由大量的节点(神经元)之间相互连接构成,每个节点代表一种特定的输出函数,称为激励函数。每两个节点之间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。
人工神经元的数学模型主要包括3部分功能:加权,求和与转移。各种不同的人工神经元数学模型的主要区别在于采用了不同的转移函数(线性函数,阈值型函数,非线性函数)

基本BP算法包括
信号的前向传播 误差的反向传播

nnet包
nnet()函数

kmeans算法
k均值法先指定聚类数,目标是使每个数据点所属聚类中心的总距离变异平方和最小,规定聚类中心时则是以该类数据点的平均值作为聚类中心
kmeans包

协同过滤推荐算法
利用某兴趣相投,拥有共同经验之群体的喜好来推荐用户感兴趣的信息

基于用户协同过滤
通过不同用户对item的评分来评测用户之间的相似性,基于用户之间的相似性做出推荐
基于项目的协同过滤
通过用户对不同item的评分来评测item之间的相似性,基于item之间的相似性做出推荐

决策树算法
构建决策树的目的 探索,预测
构建决策树的步骤
数据准备
决策树生长
决策树修剪
规则提取

决策树的分支准则
可以决定树的大小,包括树的宽度与高度 信息增益,信息增益比,Gini系数
分支变量的属性水平越多,表示使用该变量越容易获得较大的熵,同时亦代表该分支特性不显著,因此会倾向选择具有较小的熵值的属性为分支变量。而信息增益比的衡量准则倾向于选择具有较小的熵值的属性,特别是当熵值趋近于0。
符号约定

rpart包

关联规则算法
利用支持度,置信度,和增益3个衡量指标来分别表示其显著性,正确性和价值。通过最小支持度和置信度作为对应门槛,然后才能进行下一步增益价值的评估
Apriori算法
arules,arulesViz包

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335