R | R入門の想法 + tidyverse

之前一直不知道該如何學(xué)R单寂,一直用awk等命令進(jìn)行數(shù)據(jù)處理贬芥。

最開始看的《R語言實(shí)戰(zhàn)》,了解了工作目錄宣决,數(shù)據(jù)類型蘸劈,數(shù)據(jù)結(jié)構(gòu)等;

后來看《R數(shù)據(jù)科學(xué)》(網(wǎng)上可搜中文版pdf尊沸,英文網(wǎng)頁版)威沫;

練習(xí)題,搜到了張敬信老師的 玩轉(zhuǎn)數(shù)據(jù)處理120題之P1-P20(R語言tidyverse版本)洼专,有更新版棒掠,《R語言編程—基于tidyverse》新書信息匯總

教程屁商?網(wǎng)上搜tidyverse烟很、readrtibble蜡镶、dplyr雾袱、stringrtidyr官还、purrr芹橡、forcats......應(yīng)有盡有!


數(shù)據(jù)處理望伦,學(xué)好tidyverse的幾個(gè)核心包的核心函數(shù)林说,應(yīng)該就差不多了吧 ~ ~ ~


補(bǔ)充:老板讓學(xué)的 quick-R


補(bǔ)充:tidyverse的幾個(gè)核心包的主要函數(shù)

> library(tidyverse)
-- Attaching packages ----------------------- tidyverse 1.3.1 --
√ ggplot2 3.3.5     √ purrr   0.3.4
√ tibble  3.1.5     √ dplyr   1.0.7
√ tidyr   1.1.4     √ stringr 1.4.0
√ readr   2.0.2     √ forcats 0.5.1
-- Conflicts -------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()

1. tibble

data.frame煎殷、data.tabletibble

library(tibble)
# library(tidyverse)
  • tibble(): 創(chuàng)建tibble腿箩,不改變輸入的類型豪直、變量的名稱,也不創(chuàng)建行名稱
  • tribble()transposed tibble的縮寫度秘, 創(chuàng)建tibble的另一種方法
  • as_tibble(): 將數(shù)據(jù)框轉(zhuǎn)換為tibble
  • df$x顶伞、df[["x"]]df %>% .$x剑梳、df %>% .[["x"]]: 按名稱提取x列元素組成向量
  • df[[1]]: 按位置提取第1列元素組成的向量
df <- tibble(
  `>` = 1:5,
  `100` = 1,
  a = c("one", "two", "three", "four", "five"),
  `:)` = `>` * `100` + str_length(a),
)
df

# # A tibble: 5 x 4
#     `>` `100` a      `:)`
#   <int> <dbl> <chr> <dbl>
# 1     1     1 one       4
# 2     2     1 two       5
# 3     3     1 three     8
# 4     4     1 four      8
# 5     5     1 five      9
> tribble(
  ~`<`, ~`100`,
  "a", 1,
  "b", 1,
)

# # A tibble: 2 x 2
#   `<`   `100`
#   <chr> <dbl>
# 1 a         1
# 2 b         1
> df$`100` # 特殊字符唆貌,加反引號(hào)
[1] 1 1 1 1 1
> df[[">"]] # 雖然是特殊字符,但仍加雙引號(hào)
[1] 1 2 3 4 5
> mpg %>% colnames() # tibble不換行顯示垢乙,所以會(huì)顯示不全锨咙,要輸出tibble行名,可以直接使用基礎(chǔ)函數(shù) colnames()
 [1] "manufacturer" "model"        "displ"        "year"         "cyl"
 [6] "trans"        "drv"          "cty"          "hwy"          "fl"
[11] "class"
  • rownames_to_column(): 行名轉(zhuǎn)列追逮,個(gè)人感覺非常有用酪刀,不喜歡導(dǎo)入數(shù)據(jù)時(shí)第一列被自動(dòng)轉(zhuǎn)換成列名
  • rowid_to_column(): 行號(hào)轉(zhuǎn)列
  • column_to_rownames(): 列轉(zhuǎn)列名
  • has_rownames(): 判斷是否有列名
  • remove_rownames(): 移除列名
> mtcars %>% has_rownames()
[1] TRUE
> mtcars %>% remove_rownames() %>% has_rownames()
[1] FALSE
> mtcars %>% rownames_to_column("car") %>% head()
                car  mpg cyl disp  hp drat    wt  qsec vs am gear carb
1         Mazda RX4 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2     Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3        Datsun 710 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
4    Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
5 Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
6           Valiant 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

http://blog.fens.me/r-tibble/

2. readr

R基礎(chǔ)包 read.csv()read.tsv()钮孵、read.delim()
readr包骂倘,更快,生成tibble巴席,不使用行名稱......

library(readr)
# library(tidyverse)
  • read_csv(): 讀取逗號(hào)分隔文件
    skip: 傳遞數(shù)值历涝,等于2時(shí),跳過前2
    comment: 傳遞字符漾唉,等于#時(shí)荧库,丟棄所有以#開頭的行
    col_names: 1. 傳遞邏輯,是否將第一行作為列標(biāo)題赵刑,False時(shí)分衫,將各列一次標(biāo)注為X1至Xn;2. 傳遞字符向量般此,作為列名稱
    na: 可以設(shè)定哪個(gè)值或哪些值作為缺失值
  • read_tsv(): 讀取制表符分隔文件
  • read_delim(): 讀取任意分隔文件
  • read_fwf(): 讀取固定寬度文件
  • readsl: 讀取Excel文件(.xls和.xlsx均可)
  • write_csv()蚪战、write_tsv(): 寫出文件
  • write_excel_csv(): 將CSV文件導(dǎo)出為Excel文件

3. dplyr

3.1 匯總操作

  • count(): 類似于Shell中輸出某幾列后sort | uniq -c
  • group_by(): 可以按某一或幾列進(jìn)行分組
> mpg %>% group_by(manufacturer,model) %>% count()
# A tibble: 38 × 3
# Groups:   manufacturer, model [38]
   manufacturer model                  n
   <chr>        <chr>              <int>
 1 audi         a4                     7
 2 audi         a4 quattro             8
 3 audi         a6 quattro             3
 4 chevrolet    c1500 suburban 2wd     5
 5 chevrolet    corvette               5
 6 chevrolet    k1500 tahoe 4wd        4
 7 chevrolet    malibu                 5
 8 dodge        caravan 2wd           11
 9 dodge        dakota pickup 4wd      9
10 dodge        durango 4wd            7
# … with 28 more rows
  • summarise(): 默認(rèn)每行一個(gè)分組進(jìn)行統(tǒng)計(jì)描述
  • group_by() %>% summarise(): 常搭配使用
> mtcars %>% select(cyl, vs) %>% add_count(cyl, sort=TRUE)  # `sort`: 等于`TRUE`時(shí),按次數(shù)多少從大到小排序恤煞;mtcars %>% add_count(cyl) 用于添加一列次數(shù)
# A tibble: 32 x 3
     cyl    vs     n
   <dbl> <dbl> <int>
 1     8     0    14
 2     8     0    14
 3     8     0    14
 4     8     0    14
 5     8     0    14
 6     8     0    14
 7     8     0    14
 8     8     0    14
 9     8     0    14
10     8     0    14
# ... with 22 more rows
> mtcars %>% group_by(cyl) %>% summarise(count=n(),mean_disp=mean(disp))
# A tibble: 3 x 3
    cyl count mean_disp
  <dbl> <int>     <dbl>
1     4    11      105.
2     6     7      183.
3     8    14      353.

base包的幾個(gè)累積計(jì)算函數(shù)屎勘,dplyr擴(kuò)充了幾個(gè)。

  • cummax(): 累積最大值
  • cummin(): 累積最小值
  • cumsum(): 累積求和
  • cumprod(): 累積求積
  • dplyr::cummean(): 累積求平均值
> tibble(a=1:5, b=6:10) %>%
  pivot_longer(everything(), names_to="Type",values_to="Num") %>%
  arrange(Type) %>%
  group_by(Type) %>%
  mutate(Cumsum=cumsum(Num))
# A tibble: 10 × 3
# Groups:   Type [2]
   Type    Num Cumsum
   <chr> <int>  <int>
 1 a         1      1
 2 a         2      3
 3 a         3      6
 4 a         4     10
 5 a         5     15
 6 b         6      6
 7 b         7     13
 8 b         8     21
 9 b         9     30
10 b        10     40

3.2 行操作

  • filter(): 篩選行
    關(guān)系:<居扒、<=>丑慎、>=喜喂、==瓤摧、!=is.na()玉吁、!is.na()
    邏輯:&照弥、|!进副、xor()
    此外也要注意:between()这揣、%in%near()......
> a=c("audi","dodge","honda")
> mpg %>% filter(manufacturer %in% a) %>% group_by(manufacturer) %>% count()
# A tibble: 3 × 2
# Groups:   manufacturer [3]
  manufacturer     n
  <chr>        <int>
1 audi            18
2 dodge           37
3 honda            9
  • distinct(): 去除重復(fù)行
> mpg %>% select(manufacturer) %>% distinct()
# A tibble: 15 × 1
   manufacturer
   <chr>
 1 audi
 2 chevrolet
 3 dodge
 4 ford
 5 honda
 6 hyundai
 7 jeep
 8 land rover
 9 lincoln
10 mercury
11 nissan
12 pontiac
13 subaru
14 toyota
15 volkswagen
  • slice(): 按位置選擇行
> mpg %>% select(manufacturer) %>% distinct() %>% slice(c(1,1,3,5)) %>% .[[1]]
[1] "audi"  "audi"  "dodge" "honda"
  • sample_n: 隨機(jī)抽取n行數(shù)據(jù)
> mpg %>% select(manufacturer) %>% distinct() %>% sample_n(3,replace = F) %>% .[[1]]
[1] "audi"   "toyota" "dodge"
  • slice_sample(): 隨機(jī)抽取一行數(shù)據(jù)
> mpg %>% slice_sample()
# A tibble: 1 × 11
  manufacturer model      displ  year   cyl trans  drv     cty   hwy fl    class
  <chr>        <chr>      <dbl> <int> <int> <chr>  <chr> <int> <int> <chr> <chr>
1 ford         f150 pick…   4.2  1999     6 auto(… 4        14    17 r     pick…
  • arrange(): 對(duì)行排序
  • add_row()

3.3 列操作

  • pull: 提取列影斑,返回向量给赞,不能提取多列
> mpg %>% pull(year) %>% unique() # 基礎(chǔ)函數(shù)unique(),用于向量去重
[1] 1999 2008
  • select(): 篩選列
    starts_with()矫户、ends_with()片迅、contains(): 字面意義
    matches(): 匹配正則表達(dá)式
    everything(): 所有的列。把特定列放到前面后皆辽,剩下的列用everything()統(tǒng)一放置
    :: 切片取列
    -: 刪除某列
    注意使用!柑蛇,&|......
> mpg %>% select((!starts_with(c("m","d","y")) | matches("m.*er")))
# A tibble: 234 × 7
     cyl trans        cty   hwy fl    class   manufacturer
   <int> <chr>      <int> <int> <chr> <chr>   <chr>
 1     4 auto(l5)      18    29 p     compact audi
 2     4 manual(m5)    21    29 p     compact audi
 3     4 manual(m6)    20    31 p     compact audi
 4     4 auto(av)      21    30 p     compact audi
 5     6 auto(l5)      16    26 p     compact audi
 6     6 manual(m5)    18    26 p     compact audi
 7     6 auto(av)      18    27 p     compact audi
 8     4 manual(m5)    18    26 p     compact audi
 9     4 auto(l5)      16    25 p     compact audi
10     4 manual(m6)    20    28 p     compact audi
# … with 224 more rows
  • relocate(): 將列移動(dòng)到新的位置
  • across(): 以相同的方式匯總或改變多個(gè)列
  • c_across()
  • mutate(): 新增列
    配合函數(shù)case_when()驱闷、coalesce()耻台、if_else()na_if()使用
> tibble(a=1:5, b=6:10) %>% mutate(If2=if_else(b/a==2,"T","F"))
# A tibble: 5 × 3
      a     b If2
  <int> <int> <chr>
1     1     6 F
2     2     7 F
3     3     8 F
4     4     9 F
5     5    10 T
  • transmute(): 只保留新增的列
> mpg %>% transmute(mm=str_c(manufacturer, "__", model))
# A tibble: 234 × 1
   mm
   <chr>
 1 audi__a4
 2 audi__a4
 3 audi__a4
 4 audi__a4
 5 audi__a4
 6 audi__a4
 7 audi__a4
 8 audi__a4 quattro
 9 audi__a4 quattro
10 audi__a4 quattro
# … with 224 more rows
  • rename, rename_with(): 修改列名

3.4 多個(gè)數(shù)據(jù)框操作

  • left_join()
    此外空另,right_join()盆耽、inner_join()full_join()
by = c()
  • bind_cols()
  • bind_rows()
  • intersect(): 多個(gè)數(shù)據(jù)框共有的行
  • setdiff(): 多個(gè)數(shù)據(jù)框非共有的行
  • union(): 合并數(shù)據(jù)框后去重

4. tidyr

自我認(rèn)為pivot_wider()痹换、pivot_longer()tidyr最重要的兩個(gè)函數(shù)征字,其他的函數(shù)可以配合使用dplyrstringr達(dá)到相同的效果。

  • pivot_wider(): 長變寬
  • pivot_longer(): 寬變長
> mpg %>% group_by(model, year) %>% count() %>% 
  pivot_wider(id_cols=model, names_from=year, values_from=n, names_prefix = "year_")
# A tibble: 38 × 3
# Groups:   model [38]
   model              year_1999 year_2008
   <chr>                  <int>     <int>
 1 4runner 4wd                4         2
 2 a4                         4         3
 3 a4 quattro                 4         4
 4 a6 quattro                 1         2
 5 altima                     2         4
 6 c1500 suburban 2wd         1         4
 7 camry                      4         3
 8 camry solara               4         3
 9 caravan 2wd                6         5
10 civic                      5         4
# … with 28 more rows
> mpg %>% group_by(model, year) %>% count() %>% 
  pivot_wider(id_cols=model, names_from=year, values_from=n, names_prefix = "year_") %>% 
  pivot_longer(-model, names_to="year",values_to="count")
# A tibble: 76 × 3
# Groups:   model [38]
   model       year      count
   <chr>       <chr>     <int>
 1 4runner 4wd year_1999     4
 2 4runner 4wd year_2008     2
 3 a4          year_1999     4
 4 a4          year_2008     3
 5 a4 quattro  year_1999     4
 6 a4 quattro  year_2008     4
 7 a6 quattro  year_1999     1
 8 a6 quattro  year_2008     2
 9 altima      year_1999     2
10 altima      year_2008     4
# … with 66 more rows
  • expand(): 提取列娇豫,并給出所有可能的組合情況
  • complete()
> mtcars %>% expand(cyl)
# A tibble: 3 × 1
    cyl
  <dbl>
1     4
2     6
3     8
> mtcars %>% expand(cyl, vs)
# A tibble: 6 × 2
    cyl    vs
  <dbl> <dbl>
1     4     0
2     4     1
3     6     0
4     6     1
5     8     0
6     8     1
  • unite(): 合并列
  • separate(): 拆分列
  • separate_rows(): 把列拆成行
  • drop_na(): 刪除指定列含有缺失值的行
  • fill(): 缺失值填充
  • replace_na(): 指定列缺失值替換

5. stringr

5.1 檢測匹配

  • str_detect()
  • str_starts()
  • str_which()
  • str_locate()
  • str_count()
> mpg %>%
  mutate(newcol=if_else(str_detect(trans, "auto"), "A", "M")) %>%
  group_by(newcol) %>%
  count()
# A tibble: 2 × 2
# Groups:   newcol [2]
  newcol     n
  <chr>  <int>
1 A        157
2 M         77

5.2 字符提取

  • str_sub(): 提取字符的指定區(qū)段
  • str_subset(): 提取匹配的字符
  • str_extract()
  • str_extract_all()
  • str_match()

5.3 字符長度

  • str_length(): 返回字符串長度
  • str_pad(): 填充字符到一定長度
  • str_trunc(): 截?cái)嘧址揭欢ㄩL度
  • str_trim(): 去除字符開頭和末尾的空白
  • str_squish(): 減少字符中重復(fù)的空格

5.4 字符替換

  • str_replace(): 替換每個(gè)字符串的首個(gè)匹配的字符
  • str_replace_all(): 替換每個(gè)字符串所有匹配的字符
  • str_to_lower(): 所有字母小寫
  • str_to_upper(): 所有字母大寫
  • str_to_title(): 每個(gè)字符的第一個(gè)字母大寫匙姜,剩下小寫
  • str_to_sentence(): 第一個(gè)字符的第一個(gè)字母大寫,剩下小寫

5.5 組合切割

  • str_c()
> mpg %>%
  mutate(a=str_c(manufacturer, model, sep="-")) %>%
  select(a,everything())
# A tibble: 234 × 12
   a        manufacturer model  displ  year   cyl trans  drv     cty   hwy fl
   <chr>    <chr>        <chr>  <dbl> <int> <int> <chr>  <chr> <int> <int> <chr>
 1 audi-a4  audi         a4       1.8  1999     4 auto(… f        18    29 p
 2 audi-a4  audi         a4       1.8  1999     4 manua… f        21    29 p
 3 audi-a4  audi         a4       2    2008     4 manua… f        20    31 p
 4 audi-a4  audi         a4       2    2008     4 auto(… f        21    30 p
 5 audi-a4  audi         a4       2.8  1999     6 auto(… f        16    26 p
 6 audi-a4  audi         a4       2.8  1999     6 manua… f        18    26 p
 7 audi-a4  audi         a4       3.1  2008     6 auto(… f        18    27 p
 8 audi-a4… audi         a4 qu…   1.8  1999     4 manua… 4        18    26 p
 9 audi-a4… audi         a4 qu…   1.8  1999     4 auto(… 4        16    25 p
10 audi-a4… audi         a4 qu…   2    2008     4 manua… 4        20    28 p
# … with 224 more rows, and 1 more variable: class <chr>

感覺下面幾個(gè)函數(shù)對(duì)于數(shù)據(jù)框的操作沒有太大的幫助

  • str_flatten()
  • str_dup()
  • str_split_fixed()
  • str_split()
  • str_split_n()
  • str_glue()
  • str_glue_data()

5.6 字符排序

  • str_order()
  • str_sort()

6. forcats

6.1 base包中關(guān)于因子的函數(shù)

  • factor()
  • levels()
  • as_factor()
> qq <- c("d", "g", "a", "e", "f", "a", "e")
> qq <- factor(qq)

6.2 查看

  • fct_count(): 查看各個(gè)level的數(shù)量

6.3 重新排序

  • fct_relevel(): 手動(dòng)
  • fct_infreq(): 根據(jù)level出現(xiàn)的頻率
  • fct_inorder(): 根據(jù)level出現(xiàn)的順序
  • fct_rev(): 顛倒
  • fct_shift(): 平移
  • fct_shuffle(): 隨機(jī)排序
  • fct_reorder(): 根據(jù)其他變量進(jìn)行排序冯痢,這個(gè)應(yīng)該很有用
  • fct_reorder2():

6.4 改變levels值

  • fct_recode(): 手動(dòng)
  • fct_anon():
  • fct_collapse():
  • fct_lump: 根據(jù)levels的頻率進(jìn)行操作氮昧,對(duì)于篩選數(shù)據(jù)很有用
  • fct_other():

6.6 添加或刪除levels

  • fct_drop()
  • fct_expand()
  • fct_explicit_na()

7. purrr

剛看了張金龍老師的R語言視頻課(20220302),他說他目前為止還沒用過這個(gè)功能浦楣。
我平時(shí)也就是簡單地整理表格數(shù)據(jù)袖肥,purrr更適用于list,我好像也用不到......振劳,等以后接觸到再學(xué)吧椎组。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市历恐,隨后出現(xiàn)的幾起案子寸癌,更是在濱河造成了極大的恐慌专筷,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒸苇,死亡現(xiàn)場離奇詭異磷蛹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)溪烤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門味咳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人檬嘀,你說我怎么就攤上這事槽驶。” “怎么了枪眉?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵捺檬,是天一觀的道長。 經(jīng)常有香客問我贸铜,道長堡纬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任蒿秦,我火速辦了婚禮烤镐,結(jié)果婚禮上耻姥,老公的妹妹穿的比我還像新娘刊咳。我一直安慰自己肋坚,他們只是感情好傅是,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陵究,像睡著了一般辉词。 火紅的嫁衣襯著肌膚如雪禽绪。 梳的紋絲不亂的頭發(fā)上医瘫,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天侣肄,我揣著相機(jī)與錄音,去河邊找鬼醇份。 笑死稼锅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的僚纷。 我是一名探鬼主播矩距,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼怖竭!你這毒婦竟也來了锥债?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赞弥,沒想到半個(gè)月后毅整,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趣兄,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绽左,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艇潭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拼窥。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹋凝,靈堂內(nèi)的尸體忽然破棺而出鲁纠,到底是詐尸還是另有隱情,我是刑警寧澤鳍寂,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布改含,位于F島的核電站,受9級(jí)特大地震影響迄汛,放射性物質(zhì)發(fā)生泄漏捍壤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一鞍爱、第九天 我趴在偏房一處隱蔽的房頂上張望鹃觉。 院中可真熱鬧,春花似錦睹逃、人聲如沸盗扇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疗隶。三九已至,卻和暖如春翼闹,著一層夾襖步出監(jiān)牢的瞬間斑鼻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國打工橄碾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卵沉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓法牲,卻偏偏與公主長得像史汗,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拒垃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容