【R】【數據處理】如何用R實現數據透視表的操作?(二)


R將整潔數據定義為:每個變量的數據存儲在自身的列中,每個觀測值的數據存儲在其自身的行中。

【tidyr】主要功能包括

  • 數據變形(reshape data)
  • 分割數據(split data)
  • 處理缺失值(handle missing values)

數據變形


 

【gather】將寬數據轉為長數據

#理解,兩個坐標軸確定一個平面點的位置

tidyr::gather(data, key, value, ..., na.rm=FALSE)

  • data tibble或data frame數據
  • key 新數據中用於存放關鍵詞的 字段名
  • value 新數據中用於存放value的 字段名
  • ... 新數據關鍵詞來源
mydata <- tibble(
  country=c('A', 'B', 'C'),
  '1999'=c('0.7k', '37k', '212k'),
  '2000'=c('2k', '80k', '213k')
)

gather(mydata, key="year", value="cases", '1999', '2000')
mydata %>% gather(key="year", value="cases", '1999', '2000')

gather可以指定要gather的若干列

mtcarsNew <- mtcars %>% gather(`gear`,`carb`,key = "attribute", value = "value", -car) #不連續篩選
mtcarsNew <- mtcars %>% gather(mpg:drat,key = "attribute", value = "value", -car) #連續篩選,-car表示不選

 

【spread】將長數據轉為寬數據,與gather互為逆反操作

tidyr::spread(data, key, value,fill=NA, convert=FALSE, drop=TRUE)

  • data: 數據源
  • key:將變量擴展為字段的變量
  • value:需要分散的值
  • fill:將fill的賦值給轉型后的 缺失值
mydata<- tibble(
    country=rep(c('A', 'B', 'C'), each=4),
    year=rep(c(1999,2000), each=2, time=3),
    type=rep(c('cases', 'pop'), time=6),
    count=c('0.7k', '19m', '2k', '20m', '37k', '172m', '80k', '174m', '212k', '1t', '213k', '1t')
)

spread(mydata, key=type, value=count)
mydata %>% spread(key=type, value=count)

分割數據與合並數據


 【separate】將一列按照分隔符分隔為多列

tidyr::separate(data, col, into, sep)

  • data 原始數據
  • col 待分數據所在的列(字段、變量)
  • into 分割后形成的數據對應的字段(變量)
  • sep 分割數據時使用的風格符
table3 <- tibble(
    country=rep(c("A", "B", "C"), each=2),
    year=rep(c(1999, 2000), time=3),
    rate=c("0.7k/19m", "2k/20m", "37k/172m", "80k/174m", "212k/1t", "213k/1t")
)
separate(table3, col=rate, into=c("cases", "pop"), sep="/")

【separate_rows】將數據分為多行

tidyr::separate_rows(data, ..., sep)

  • data 原始數據
  • ... 待分數據所在的列(字段、變量)
  • sep 分割數據時使用的風格符
separate_rows(table3, rate, sep='/')

【unite】將多列按照指定的分隔符合並為一列

tidyr::unite(data, col, ..., sep, remove=TRUE)

  • data 原始數據
  • col  新生成的字段(變量、列)名
  • ... 合並前的字段(變量、列)名
  • sep 合並使用的分割符
  • remove 是否刪除被組合的列
table5 <- tibble(
    country=rep(c("Afghan", "Brazil", "China"), each=2),
    century=rep(c('19', '20'), time=3),
    year=rep(c('99', '00'), time=3)
)
unite(table5, col="year", century, year, sep="")

處理缺失值


 

【缺失值識別】

is.na(), is.nan(), is.infinite()

 

【drop_na】剔除數據中的缺失值

x <- tibble(x1=c("A", "B", "C", "D", "E"),
            x2=c(1, NA, NA, 3, NA))
drop_na(x, x2) #數據集,指定列

 【fill】將數據中的缺失值進行填充(填充的值是缺失值附近的數值)

tidyr::fill(data, ..., direction=c("down", "up"))

fill(x, x2) #默認是用上一個值填充

 【replace_na】將缺失值替換為其它值

tidyr::replace_na(data, replace=list(), ...) 

replace_na(x, list(x2=2))

  

參考:R----tidyr包介紹學習 - Little_Rookie - 博客園 (cnblogs.com)R語言 | 數據操作tidyr包 - thunderhit的個人空間 - OSCHINA - 中文開源技術交流社區

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM