R包dplyr——數(shù)據(jù)處理必備神器

  • %>% 管道符

    傳遞變量郁轻,簡(jiǎn)潔代碼卵凑。

    • 用法:df %>% select(mpg,wt)->df1,運(yùn)行一下叉趣,看看是不是選擇了 df 中的暮胧,mpg锐借,wt 兩列呢,并且我們將結(jié)果賦值給了變量 df1
    • 作用 1:將 df,傳遞到 select 函數(shù)中的第一個(gè)位置问麸,事實(shí)上,我們還可以通過(guò)"."作為占位符钞翔,來(lái)將 df 放到任意位置严卖。
      比如df%>%select(mpg,wt,.) ,注意看,wt 后面有一個(gè)點(diǎn)布轿,當(dāng)然這條語(yǔ)句是不能正常運(yùn)行的哮笆,我只是想告訴大家,通過(guò)“點(diǎn)”作為占位符汰扭,可以將上一個(gè)結(jié)果稠肘,放到下一個(gè)管道中的任意位置。
    • 作用 2:有沒(méi)有發(fā)現(xiàn)用了管道符之后萝毛,我們?cè)俅问褂昧忻?mpg 的時(shí)候项阴,便不需要使用 df$mpg 了呢,沒(méi)錯(cuò)笆包,它的另外一個(gè)功能就是類似于 attach环揽,數(shù)據(jù)綁定的功能,使用管道符色查,能讓我們的代碼更加簡(jiǎn)潔薯演。
  • select() 篩選列

用列名進(jìn)行篩選。

  • 巧用以下符號(hào)
    • ":"該符號(hào)表示用于選擇一系列的變量秧了。
    • "!":表示取反操作的跨扮,類似于在 df 中不選擇某列,比如 df[,-1],表示不選擇第一列
    • "&":表示邏輯運(yùn)算符“與”验毡,表示“且”的意思衡创。A&B,表示滿足條件 A晶通,且滿足條件 B
    • "|":表示邏輯運(yùn)算符“或”璃氢,表示“或”的意思。A|B狮辽,表示滿足條件 A 或者滿足條件 B 就可以了一也,通常具有短路操作。
    • "c()":就是表示列的組合喉脖,其實(shí)就是向量椰苟,元素可為數(shù)字或者字符串。
    • "-" :去除
  • 下面還有幾個(gè)比較重要的函數(shù)树叽,可以作為 select 選擇列的參數(shù)來(lái)使用舆蝴。
    • last_col() : 表示選擇最后一列。
    • starts_with():表示以什么開(kāi)頭的列。
    • ends_with():表示以什么結(jié)尾的列洁仗。
    • contains():表示某列是否包含什么內(nèi)容层皱。
    • one_of():選擇字符向量中的列,select中不能直接使用字符向量篩選赠潦,需要使用one_of函數(shù).
    • everything:一般用于調(diào)整列順序叫胖,把a(bǔ)列放到最前面
      select(iris, a, everything())
  • 例子:
    • 選擇 df 中的第一列到第五列。
      用法:select(df,1:5)或者select(df,c(1,2,3,4,5))
    • 選擇 df 中的 mpg wt 之間的所有列她奥,包括(mpg,wt)
      用法:select(df,"mpg":"wt")
    • 選擇某些列以"d"開(kāi)頭臭家,或者以"p"結(jié)尾的。
      用法:select(df,starts_with("d")|ends_with("p"))
    • 選擇某些列以"d"開(kāi)頭方淤,且以"t"結(jié)尾的。
      用法:select(df,starts_with("d")&ends_with("t"))
    • 選擇以"d"開(kāi)頭蹄殃,且包含"s"的列携茂。
      用法:select(df,starts_with("d")&contains("s"))
    • 選擇以"d"開(kāi)頭,且以"p"結(jié)尾的列.
      用法:select(df,!(starts_with("d"))&(ends_with("p")))
    • 選擇向量里的字符串變量名 :vars <- c("A", "B") select(iris, one_of(vars))
    • 返回指定字符向量之外的列 "-" :
      select(iris, - one_of(vars))

  • rename() 重命名 給定列

保留所有的列诅岩,只對(duì)給定的列重新命名讳苦。原數(shù)據(jù)集行名稱會(huì)被過(guò)濾掉。

rename(data,new_name= old_name)

#重命名列Petal.Length吩谦,返回子數(shù)據(jù)集只包含重命名的列
select(iris, petal_length = Petal.Length)
#重命名所有以Petal為前綴的列鸳谜,返回子數(shù)據(jù)集只包含重命名的列
select(iris, petal = starts_with("Petal"))
#重命名列Petal.Length,返回全部列
rename(iris, petal_length = Petal.Length)

  • filter() / slice() 篩選行

  • slice() 函數(shù)通過(guò)行號(hào)選取數(shù)據(jù)式廷。
  • filter() 通過(guò)邏輯運(yùn)算篩選咐扭。
    • ==, >, >= etc
    • &, |, !, xor()
    • is.na()
    • between(), near()
      • between(x,a,b):假設(shè) x 是一個(gè)數(shù)值型向量,該函數(shù)判斷 x 中元素是否(>=a)&(<=b)滑废,返回一個(gè)邏輯型向量蝗肪。
  • 例子:
    - 選擇 df 中,hp 列大于等于 110蠕趁,小于等于 150 的行,且 gear 列等于 4薛闪。filter(df,between(df$hp,110,150)&(df["gear"]==4))
    - 選擇 df 中,hp 列大于 disp 列的行俺陋。
    filter(df,df["hp"]>df["disp"])
  #選取第一行數(shù)據(jù)
slice(mtcars, 1L)
filter(mtcars, row_number() == 1L)
#選取最后一行數(shù)據(jù)
slice(mtcars, n())
filter(mtcars, row_number() == n())
#選取第5行到最后一行所有數(shù)據(jù)
slice(mtcars, 5:n())
filter(mtcars, between(row_number(), 5, n()))

  • arrange()排序

    默認(rèn)是升序豁延,如需降序,則使用 desc()函數(shù)腊状。
    • 使 df 按照 mpg 列升序排列诱咏,wt 列,升序排列寿酌。
      arrange(df,"mpg","wt")
    • 使 df 按照 mpg 列升序排列胰苏,wt 列,降序排列。
      arrange(df,"mpg",desc("wt"))

  • mutate () 列計(jì)算/變形

mutate():產(chǎn)生新的列硕并,保留舊的列法焰。
新變量名 ,計(jì)算并賦值給變量名

transmute()只返回?cái)U(kuò)展的新變量倔毙。原數(shù)據(jù)集行名稱會(huì)被過(guò)濾掉埃仪。

    df%>%
    select(cyl,gear,wt)%>%
    mutate(cyl2=cyl*2,gear4=gear*4,
                    wt=NULL #將值設(shè)置為NULL,可將這列刪除
                    )%>%
    head()
    ##cyl 和 gear 還在
    ## 新增列的位置:.before | .after
    #假如想指定這些新增加的列放在哪個(gè)列之前或者之后陕赃,使用 .before=原來(lái)df中的某個(gè)列名卵蛉,可以將新增加列,放在原來(lái)的那個(gè)列名前面么库,注意before參數(shù)前面有個(gè)點(diǎn)I邓俊!诉儒,.after表示放在某個(gè)列之后葡缰。

  • summarise()對(duì)數(shù)據(jù)框或者分組變量進(jìn)行統(tǒng)計(jì)性描述。

常用結(jié)合函數(shù)

  • Center: mean()忱反,median()
  • Spread:sd(), IQR() , mad()
  • Range:min() ,max(), quantile()
  • Position: first(), last(), nth()
  • Count: n() ,n_distinct()
  • Logical :any() ,all()
  • quantile():- 默認(rèn)返回四分位(0泛释,0.25(Q1),0.5(Q2)温算,0.75(Q3)怜校,1)

    • quantile(1:10,c(0.25,0.75))#第二個(gè)參數(shù)控制 分位值
  • IQR () : 四分位間距

    • IQR(1:10 ) >IQR =Q3-Q1 =7.75-3.25=4.5
  • median():中位數(shù) Q2

  • nth( ) : 表示抽取向量中哪一個(gè)位置的元素

    • 比如 nth(c(1,5,2),2)抽取的是第二個(gè)位置的注竿,返回 5茄茁,還可以通過(guò)負(fù)號(hào),來(lái)表示抽取倒數(shù)第幾個(gè)蔓搞,比如 nth(c(1,5,2),-3)胰丁,表示抽取倒數(shù)第三個(gè),就是 1
  • n( ):
    - 返回當(dāng)前分組或者變量的信息喂分,通常是計(jì)數(shù)锦庸,通常用在特定函數(shù),比如 summarize,mutate 中蒲祈。

  • n_distinct() : 去重后甘萧,再計(jì)數(shù)。

  • first(),last():
    - 參數(shù)可以為一個(gè)向量梆掸,分別返回向量的第一個(gè)值扬卷,和最后一個(gè)值。

  • mad() : 中位數(shù)絕對(duì)偏差


  • group_by() 對(duì)數(shù)據(jù)框按照一列或者多列進(jìn)行分組

group_by()用于對(duì)數(shù)據(jù)集按照給定變量分組酸钦,返回分組后的數(shù)據(jù)集怪得。對(duì)返回后的數(shù)據(jù)集使用以上介紹的函數(shù)時(shí),會(huì)自動(dòng)的對(duì)分組數(shù)據(jù)操作。

group_by() 后徒恋,數(shù)據(jù)外觀不變蚕断。(與 summarize()聯(lián)用,分組統(tǒng)計(jì)描述入挣。)

#使用變量cyl對(duì)mtcars分組亿乳,返回分組后數(shù)據(jù)集
by_cyl <- group_by(mtcars, cyl)
#返回每個(gè)分組中最大disp所在的行
filter(by_cyl, disp == max(disp))
#返回每個(gè)分組中變量名包含d的列,始終返回分組列cyl
select(by_cyl, contains("d"))
#使用mpg對(duì)每個(gè)分組排序
arrange(by_cyl,  mpg)
#對(duì)每個(gè)分組無(wú)重復(fù)的取2行記錄
sample_n(by_cyl, 2)



#使用變量cyl對(duì)mtcars分組径筏,然后對(duì)分組后數(shù)據(jù)集使用聚合函數(shù)
by_cyl <- group_by(mtcars, cyl)
#返回每個(gè)分組的記錄數(shù)
summarise(by_cyl, n())
#求每個(gè)分組中disp和hp的均值
summarise(by_cyl, mean(disp), mean(hp))
#返回每個(gè)分組中唯一的gear的值
summarise(by_cyl, n_distinct(gear))
#返回每個(gè)分組第一個(gè)和最后一個(gè)disp值
summarise(by_cyl, first(disp))
summarise(by_cyl, last(disp))
#返回每個(gè)分組中最小的disp值
summarise(by_cyl, min(disp))
summarise(arrange(by_cyl,  disp), min(disp))
#返回每個(gè)分組中最大的disp值
summarise(by_cyl, max(disp))
summarise(arrange(by_cyl,  disp), max(disp))
#返回每個(gè)分組中disp第二個(gè)值
summarise(by_cyl, nth(disp,2))

#使用cyl對(duì)數(shù)據(jù)框分組
grouped <- group_by(mtcars, cyl)
#獲取分組數(shù)據(jù)集所使用的分組變量
groups(grouped)
#ungroup從數(shù)據(jù)框中移除組合信息葛假,因此返回的分組變量為NULL
groups(ungroup(grouped))

##計(jì)數(shù):
group_size用于返回每個(gè)分組的記錄數(shù),n_groups返回分成的組數(shù)滋恬。
 對(duì)數(shù)據(jù)集的每個(gè)分組計(jì)數(shù)聊训,類似于base:: table()函數(shù)。其中count已經(jīng)過(guò)group_by分組恢氯,而tally需要對(duì)數(shù)據(jù)集調(diào)用group_by后對(duì)分組數(shù)據(jù)計(jì)數(shù)魔眨。

tally(x, wt, sort = FALSE)
count(x, ..., wt =NULL, sort = FALSE)
#使用count對(duì)分組計(jì)數(shù),數(shù)據(jù)已按變量分組
count(mtcars, cyl)
#設(shè)置sort=TRUE酿雪,對(duì)分組計(jì)數(shù)按降序排序
count(mtcars, cyl, sort = TRUE)
#使用tally對(duì)分組計(jì)數(shù),需要使用group_by分組
tally(group_by(mtcars, cyl))
#使用summarise對(duì)分組計(jì)數(shù)
summarise(group_by(mtcars, cyl), n())

版權(quán)聲明:本文為CSDN博主「Kingsley_W」的原創(chuàng)文章侄刽,遵循CC 4.0 BY-SA版權(quán)協(xié)議指黎,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wltom1985/article/details/54973811

  • sample_n ():從給定的數(shù)據(jù)框中州丹,采樣 n 個(gè)數(shù)據(jù)醋安。
    sample_n(數(shù)據(jù),采樣個(gè)數(shù),replace=FALSE | TRUE)
    • replace 表示是否放回抽樣,默認(rèn)為 FALSE墓毒,不放回抽樣吓揪,如果需要放回抽樣,則需要設(shè)置為 replace=TRUE
  • sample_frac ():從給定的數(shù)據(jù)框中所计,采樣多少比例的數(shù)據(jù)柠辞。
    sample_frac(df,0.5,replace=FALSE) 從 df 中,采樣 50%的數(shù)據(jù)主胧。
  • case_when ( ) :針對(duì)向量元素叭首,對(duì)符合條件的,做操作踪栋。
    1.當(dāng)向量中的元素不符合條件時(shí)候焙格,會(huì)被當(dāng)做 NA,你操作的向量元素個(gè)數(shù)夷都,和 case_when 輸出的向量元素個(gè)數(shù)相等眷唉。
    2.每個(gè)條件的執(zhí)行是有順序的,順序從上往下執(zhí)行!
    3.輸出的向量的類型必須是統(tǒng)一的冬阳,要么為數(shù)值型向量蛤虐,要么為字符型向量,是什么類型取決于最上面執(zhí)行的條件判斷摩泪。
    4.當(dāng)進(jìn)行兩個(gè)向量間的條件判斷的時(shí)候笆焰,兩個(gè)向量的元素個(gè)數(shù)必須相等
    格式為:case_when(條件 1~針對(duì)條件 1 進(jìn)行的操作,TRUE~某操作)
    其中,符號(hào)"~"可理解為賦值操作见坑。TRUE 可理解為 else,注意 else 的范圍是最大的嚷掠,如果放在第一行,并且進(jìn)行的是賦值操作荞驴,那么就會(huì)返回你賦的值不皆,如果是針對(duì)向量元素的操作,那么返回的還是一個(gè)向量熊楼。見(jiàn)下圖霹娄。
    • if_else ( ):對(duì)向量進(jìn)行條件篩選,然后操作鲫骗。
      • if_else(條件犬耻,滿足條件的元素的操作,不滿足條件的元素的操作)
  • 集合操作:

    • union():并集去重
    • union_all( ) : 并集不去重
    • intersect : 交集
    • setdiff():差集
    • setdiff(a,b)a 中哪些在 b 中沒(méi)有
    • setequal() : 判斷是否相等
  • distinct():數(shù)據(jù)框去重执泰。

    distinct(df,變量名 1,變量名 2,.keep_all=FALSE)
    默認(rèn)使用所有變量去重枕磁,除非指定變量。
    ‘ .keep_all ’ :去重后是否保留所有變量术吝。(FALSE计济,則只保留指定用于去重的變量)
  • 數(shù)據(jù)框連接:inner_join, left_join, right_join, full_join,anti_join,semi_join

reference:
R 語(yǔ)言中 dplyr 包 join 函數(shù)之目前我看到過(guò)的最形象的教程 - 簡(jiǎn)書 (jianshu.com)

GitHub - gadenbuie/tidyexplain: ??♀ Animations of tidyverse verbs using R, the tidyverse, and gganimate

image
image
  • 內(nèi)連接 inner_join 函數(shù)

    • 內(nèi)連接的結(jié)果是一個(gè)新數(shù)據(jù)框,其中包含鍵排苍、 x 值和 y 值沦寂。我們使用 by 參數(shù)告訴 dplyr 哪個(gè)變量是鍵:
  • 外連接

    • 內(nèi)連接保留同時(shí)存在于兩個(gè)表中的觀測(cè), 外連接則保留至少存在于一個(gè)表中的觀測(cè)淘衙。外連接有 3 種類型传藏。

    ? 左連接:保留 x 中的所有觀測(cè)。

    ? 右連接:保留 y 中的所有觀測(cè)

    ? 全連接:保留 x 和 y 中的所有觀測(cè)彤守。

  • 篩選連接

    • semi_join(x, y): 保留 x 表中與 y 表中的觀測(cè)相匹配的所有觀測(cè)漩氨。
    • anti_join(x, y): 丟棄 x 表中與 y 表中的觀測(cè)相匹配的所有觀測(cè)。
  • 數(shù)據(jù)框合并:

合并的對(duì)象為數(shù)據(jù)框遗增,也可以是能夠轉(zhuǎn)換為數(shù)據(jù)框的列表叫惊。

  • 按行合并函數(shù)bind_rows()通過(guò)列名進(jìn)行匹配,不匹配的值使用NA替代做修,類似于base:: rbind()函數(shù)霍狰。
  • 按列合并函數(shù)bind_cols()通過(guò)行號(hào)匹配抡草,因此合并的數(shù)據(jù)框必須有相同的行數(shù),函數(shù)類似于base:: cbind()函數(shù)蔗坯。原數(shù)據(jù)集行名稱會(huì)被過(guò)濾掉康震。語(yǔ)法如下:
  #按行合并,.id添加新列用于指明合并后每條數(shù)據(jù)來(lái)自的源數(shù)據(jù)框

  bind_rows(...,.id = NULL)

  #按列合并

  bind_cols(...)

  #合并數(shù)據(jù)集

   combine(...)

Reference :
https://blog.csdn.net/wltom1985/article/details/54973811
https://zhuanlan.zhihu.com/p/358167377

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宾濒,一起剝皮案震驚了整個(gè)濱河市腿短,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绘梦,老刑警劉巖橘忱,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卸奉,居然都是意外死亡钝诚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門榄棵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)凝颇,“玉大人,你說(shuō)我怎么就攤上這事疹鳄∨÷裕” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵瘪弓,是天一觀的道長(zhǎng)辑鲤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)杠茬,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任弛随,我火速辦了婚禮瓢喉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舀透。我一直安慰自己栓票,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布愕够。 她就那樣靜靜地躺著走贪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惑芭。 梳的紋絲不亂的頭發(fā)上坠狡,一...
    開(kāi)封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音遂跟,去河邊找鬼逃沿。 笑死婴渡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凯亮。 我是一名探鬼主播边臼,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼假消!你這毒婦竟也來(lái)了柠并?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤富拗,失蹤者是張志新(化名)和其女友劉穎臼予,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體媒峡,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘟栖,尸身上長(zhǎng)有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
  • 文/蒙蒙 一河泳、第九天 我趴在偏房一處隱蔽的房頂上張望沃呢。 院中可真熱鬧,春花似錦拆挥、人聲如沸薄霜。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惰瓜。三九已至,卻和暖如春汉矿,著一層夾襖步出監(jiān)牢的瞬間崎坊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工洲拇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留流强,地道東北人痹届。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像打月,于是被迫代替她去往敵國(guó)和親队腐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

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