原始的數據結構如下:
library(dplyr)library(magrittr)tmp<-data.frame(x=c(1,1,2,1,2,2),y=letters[1:6])> tmp x y1: 1 a2: 1 b3: 2 c4: 1 d5: 2 e6: 2 f任務有兩種:
x new <dbl> <chr>1 1 a.b.d2 2 c.e.fx y new <dbl> <fct> <chr>1 1 a a.b.d2 1 b a.b.d3 2 c c.e.f4 1 d a.b.d5 2 e c.e.f6 2 f c.e.f其實這個任務,目的非常的明確,那麼,如何快速來實現呢?從思路上來說,其實無非就是分組,然後合併即可,簡單如下:
tmp%>%group_by(x)%>%summarise(new=paste0(y,collapse = ".")) x new <dbl> <chr>1 1 a.b.d2 2 c.e.f當時因為沒有好好理解分組與summarize的操作,以為summarize只能作一些數學的運算,其實paste0之類的,完全是可以的,比如說,計算分組之後,這些字符串的其它的運算,比如進一步算字符串的個數等:
tmp%>%group_by(x)%>%summarise(new=paste0(y,collapse = ".")%>%nchar()) x new <dbl> <int>1 1 52 2 5 x new <dbl> <int>1 1 52 2 5想想也是慚愧,這個本來是一個很簡單的事情,卻因為思維的固化沒想到。
相比任務1,任務2也是類似,用mutate生成新列即可:
tmp%>%group_by(x)%>%mutate(new=paste0(y,collapse = ".")) x y new <dbl> <fct> <chr>1 1 a a.b.d2 1 b a.b.d3 2 c c.e.f4 1 d a.b.d5 2 e c.e.f6 2 f c.e.f是不是挺簡單的?只要分組之後,啥都好說
說到任務1,原來為了解決這個問題,看到一個騷操作:
library(data.table)tmp<-data.table(tmp)tmp[,lapply(.SD,paste0,collapse = "."),by=x]可能重點就是data.table裡的一些使用,不過個人不熟,只能照代碼來弄一下,其意思就是,將原來的數據,按照x列分之後進行連接,結果是一樣的;重點是一定要加載data.table包並且把數據轉成data.table的格式。
> tmp[,lapply(.SD,paste0,collapse = "."),by=x] x y1: 1 a.b.d2: 2 c.e.f用到summarize之後,看了下幫助文件,其實裡面關於生成的數據,分組怎麼保留,有個.groups參數,值得去了解一下。
mtcars %>% group_by(am) %>% summarise(mpg = sum(mpg), .groups = 'drop')
mtcars %>% group_by(am, vs) %>% summarise(mpg = sum(mpg), .groups = 'drop')
> mtcars %>%+ group_by(am, vs) %>%+ summarise(mpg = sum(mpg), .groups = 'keep') am vs mpg <dbl> <dbl> <dbl>1 0 0 181.2 0 1 145.3 1 0 118.4 1 1 199.
> mtcars %>%+ group_by(am, vs) %>%+ summarise(mpg = sum(mpg), .groups = 'drop_last') am vs mpg <dbl> <dbl> <dbl>1 0 0 181.2 0 1 145.3 1 0 118.4 1 1 199.這一類的分組是否保留,影響到下一步的操作,值得注意一下。
好了,今天的分享就到這裡,大家周末愉快。
1.https://stackoverflow.com/questions/62140483/how-to-interpret-dplyr-message-summarise-regrouping-output-by-x-override
往期回顧:
歡迎關注與轉發,如有不懂,可以共同探討,在後臺留言或者是掃碼下方。