中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

R語言的tidyr包怎么用

發布時間:2022-01-20 14:54:24 來源:億速云 閱讀:179 作者:iii 欄目:開發技術

這篇文章主要講解了“R語言的tidyr包怎么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“R語言的tidyr包怎么用”吧!

前言

reshape2包在數據處理階段幫助我們很容易的實現長寬格式數據之間的轉換。tidyr包可以看作是reshape2包的進化版本,該包的作者依舊是Rstudio的首席科學家,R語言界的大神Hadley Wickham。tidyr包往往與dplyr包結合使用,目前漸有取代reshape2包之勢, 是值得關注的一個R包。

在tidyr包中,有四個常用的函數,分別是:

  • gather():寬數據轉換為長數據,將行聚集成列

  • spread():長數據轉換為寬數據,將列展開為行

  • unite():多列合并為一列

  • separate():將一列分離為多列.

接下來我們主要對這四個函數進行詳細學習,并在此基礎上學習tidyr包其他的一些實用功能。

一、gather()函數

導入所用的包

> library(dplyr)
> library(tidyr)

如前面所說,gather()函數是將寬數據轉換為長數據,調用公式如下:

> gather(data=,key=,value=,...,na.rm=,convert=,factor_key=)
# key:創建一個新的列名,原數據的舊列名成為新列名的觀測值
# value:再創建一個新的列名,原數據的所有舊列名的觀測值成為新列名的觀測值
# ...:按照實際需要自行指定需要轉換的列
# na.rm:邏輯值,是否刪除缺失值
# convert:邏輯值,在key列是否進行數據類型轉換
# factor_key:邏輯值,若是F,則key自動轉換為字符串,反之則是因子(原始lever水平保持不變)

首先我們先查看原始數據:

> head(iris,3)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa

使用gather()函數進行數據重塑(代碼中'%>%'為管道函數,這也是我們為什么要載入dplyr包的原因,關于管道函數,詳見R Language Learning:dplyr包(十一))

> iris %>%
+ gather(key=var1,value = var2,...=1:4,na.rm = F) %>%
+ arrange(desc(var2)) %>%
+ head(3)
       Species         var1 var2
1    virginica Sepal.Length  7.9
2    virginica Sepal.Length  7.7
3    virginica Sepal.Length  7.7

二、spread()函數

spread()函數將長數據轉為寬數據,即將列展開為行,調用公式如下:

> spread(data = ,key = ,value = ,fill = ,convert = ,drop = )
# key:指定轉換的某列,其觀測值作為轉換后的列名
# value:其他列的觀測值分散到相對應的各個單元
# fill:設定某個值,替換缺失值

我們使用R中的economics數據集來使用學習這一函數。

# 提取原數據集前三列
> data <- economics[1:3]
> head(data,3)
# A tibble: 3 × 3
        date   pce    pop
      <date> <dbl>  <int>
1 1967-07-01 507.4 198712
2 1967-08-01 510.5 198911
3 1967-09-01 516.3 199113
# 由于手邊沒有合適的長數據,所以我們先使用gather函數生成一份新的長數據,并假定我們要對這一份長數據進行列轉行
> data %>%
+ gather(key=var1,value = var2,-date) %>%
+ head(3)
# A tibble: 3 × 3
         date  var1  var2
       <date> <chr> <dbl>
1  1967-07-01   pce 507.4
2  1967-08-01   pce 510.5
3  1967-09-01   pce 516.3
# -date:默認數據集中的date不做變化
# 使用spread()函數進行了長數據向寬數據的轉換
# 原有的var1變量作為轉換后的列名,var2變量值作為相應的觀測值分散到各列
> data %>%
+ gather(key = var1,value = var2,-date) %>%
+ spread(key = var1,value = var2) %>%
+ head(3)
# A tibble: 3 × 3
         date   pce    pop
       <date> <dbl>  <dbl>
1  1967-07-01 507.4 198712
2  1967-08-01 510.5 198911
3  1967-09-01 516.3 199113

三、unit()函數

unite()函數是將數據框中多列合并為一列,調用公式如下:

> unite(data = ,col = ,... = ,sep = ,remove = )
# col:指定組合為新列的名字
# ...:指定數據中哪些列組合在一起
# sep:組合后新列中數據之間的分隔符
# remove:邏輯值,是否保留參與組合的列
# 數據準備
> date <- as.Date('2016-11-01') + 0:29
> hour <- sample(1:24,replace = TRUE,30)
> min <- sample(1:60,replace = TRUE,30)
> second <- sample(1:60,replace = TRUE,30)
> event <- sample(letters,30,replace = TRUE)
> data <- data.frame(date,hour,min,second,event)
> head(data,3)
        date hour min second event
1 2016-11-01   23  59     11     y
2 2016-11-02   21  12      4     u
3 2016-11-03    2  55     42     i

在這里,我們使用unite()函數將日期和時間數值合并到一列上。

# date和hour用空格連接
# datehour與時間數值用':'連接
> data %>%
+ unite(datehour,date,hour,sep=' ') %>%
+ unite(datetime,datehour,min,second,sep=':') %>%
+ head(3)
              datetime event
1  2016-11-01 23:59:1      y
2  2016-11-02 21:12:4      u
3  2016-11-03 2:55:42      i

四、separate()函數

在學習了unite()函數后,separate()函數就很好理解了,它的作用正好和unite相反,即將數據框中的某列按照分隔符拆分為多列,一般用于時間序列的拆分,調用公式如下:

> separate(data = ,col = ,into = ,sep = ,remove = ,
+ convert = ,extra = ,fill = ,...)
# col:待拆分的某列
# into:定義拆分后新的列名
# sep:分隔符
# remove:邏輯值,是否刪除拆分后的列

我們使用上一節得到的時間數據集,定義為data_unite,并對它進行拆分

# 先拆分日期和時間,在對時間進行細拆分
> data_unite %>%
+ separate(datetime,c('date','time'),sep=' ') %>%
+ separate(time,c('hour','min','second'),sep=':') %>%
+ head(3)
         date hour min second event
1  2016-11-01   23  59      1     y
2  2016-11-02   21  12      4     u
3  2016-11-03    2  55     42     i

五、缺失值的簡單補齊

> library(readxl)
> data <- read_excel('data.xlsx')
> data
# A tibble: 8 × 2
   type   num
  <chr> <dbl>
1     a    75
2     b    72
3  <NA>    66
4     a    NA
5     c    69
6     b    65
7     a    72
8     c    NA

從上面的數據中,我們可以看到類型與數值都存在缺失值。對于類型的缺失值,我們選擇眾數替換,對于數值型的缺失值,我們選擇均值替換(也可選擇中位數等,視具體情況而定)

> num_mean <- mean(data$num, na.rm = TRUE)
> type_mode <- as.character(data$type[which.max(table(data$type))])
> data <- replace_na(data = data, replace = list(num = num_mean, 
+ type = type_mode))
> data
# A tibble: 8 × 2
   type      num
  <chr>    <dbl>
1     a 75.00000
2     b 72.00000
3     a 66.00000
4     a 69.83333
5     c 69.00000
6     b 65.00000
7     a 72.00000
8     c 69.83333

感謝各位的閱讀,以上就是“R語言的tidyr包怎么用”的內容了,經過本文的學習后,相信大家對R語言的tidyr包怎么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

慈利县| 凤山市| 辉县市| 和硕县| 开阳县| 谢通门县| 略阳县| 吉木乃县| 天等县| 东山县| 吉林市| 阳江市| 临邑县| 顺义区| 宜良县| 东乌珠穆沁旗| 大城县| 高雄市| 曲阜市| 涡阳县| 富宁县| 泊头市| 芜湖市| 中牟县| 郯城县| 松滋市| 北流市| 昭平县| 彭泽县| 福安市| 本溪市| 博客| 天气| 太白县| 贺州市| 潍坊市| 江油市| 荥阳市| 丰原市| 晋中市| 左贡县|