簡體   English   中英

如何使用 dplyr 轉置 R 中的數據幀?

[英]How to transpose a data frame in R using dplyr?

我試圖弄清楚這一點,但我無法得到任何工作。

這是我的data.frame。


Type   Claims   Adds   Family   Individual   ES     SO
A       0         10     1          9         6      4         
B       0         17     1          9         2      6      
C       2         16     2          5         6      4
D       6         15     1          6         6      4
E       7         12     3          9         8      6

我的目標是變成這個

Type             A      B    C     D    E
Claims           0      0    2     6    7
Adds             10     17   16    15   12
Family           1      1    2     1    3
Individuals      9      9    5     6    9
ES               6      2    6     6    8
SO               4      6    4     4    6

我一直在嘗試使用 transpose(data) ,但結果是錯誤的。

使用t給出一個矩陣,因此為as.data.frame

library(dplyr)
dat[-1] %>% t() %>% as.data.frame() %>% setNames(dat[,1])
#             A  B  C  D  E
# Claims      0  0  2  6  7
# Adds       10 17 16 15 12
# Family      1  1  2  1  3
# Individual  9  9  5  6  9
# ES          6  2  6  6  8
# SO          4  6  4  4  6

或沒有dplyr

setNames(as.data.frame(t(dat[-1])), dat[,1])
#             A  B  C  D  E
# Claims      0  0  2  6  7
# Adds       10 17 16 15 12
# Family      1  1  2  1  3
# Individual  9  9  5  6  9
# ES          6  2  6  6  8
# SO          4  6  4  4  6

編輯

要將行名作為列,有tibble::rownames_to_column

dat[-1] %>% t() %>% as.data.frame() %>% setNames(dat[,1]) %>% 
  tibble::rownames_to_column("xyz")
#          xyz  A  B  C  D  E
# 1     Claims  0  0  2  6  7
# 2       Adds 10 17 16 15 12
# 3     Family  1  1  2  1  3
# 4 Individual  9  9  5  6  9
# 5         ES  6  2  6  6  8
# 6         SO  4  6  4  4  6

或沒有包裹:

setNames(data.frame(names(dat)[-1], unname(t(dat[-1]))), c("xyz", dat[,1]))
#          xyz  A  B  C  D  E
# 1     Claims  0  0  2  6  7
# 2       Adds 10 17 16 15 12
# 3     Family  1  1  2  1  3
# 4 Individual  9  9  5  6  9
# 5         ES  6  2  6  6  8
# 6         SO  4  6  4  4  6

數據:

dat <- structure(list(Type = c("A", "B", "C", "D", "E"), Claims = c(0L, 
0L, 2L, 6L, 7L), Adds = c(10L, 17L, 16L, 15L, 12L), Family = c(1L, 
1L, 2L, 1L, 3L), Individual = c(9L, 9L, 5L, 6L, 9L), ES = c(6L, 
2L, 6L, 6L, 8L), SO = c(4L, 6L, 4L, 4L, 6L)), class = "data.frame", row.names = c(NA, 
-5L))

如果 Type 是列而不是行名,則轉置會將所有內容強制轉換為字符。 您可以使用以下命令在基礎 R 中創建行名和轉置:

rownames(df) <- df$Type
df <- df[ , -1]
df <- t(df)
df <- as.data.frame(df)

這是從data.table transpose的選項

library(data.table)
out <- data.table::transpose(setDT(dat), make.names = 'Type', keep.names = 'Type')

-輸出

out
#         Type  A  B  C  D  E
#1:     Claims  0  0  2  6  7
#2:       Adds 10 17 16 15 12
#3:     Family  1  1  2  1  3
#4: Individual  9  9  5  6  9
#5:         ES  6  2  6  6  8
#6:         SO  4  6  4  4  6

它會自動更改原始數據中的類型

str(out)
#Classes ‘data.table’ and 'data.frame': 6 obs. of  6 variables:
# $ Type: chr  "Claims" "Adds" "Family" "Individual" ...
# $ A   : int  0 10 1 9 6 4
# $ B   : int  0 17 1 9 2 6
# $ C   : int  2 16 2 5 6 4
# $ D   : int  6 15 1 6 6 4
# $ E   : int  7 12 3 9 8 6

如果我們想使用管道

library(magrittr)
dat %>% 
    data.table::transpose(make.names = 'Type', keep.names = 'Type')

數據

dat <- structure(list(Type = c("A", "B", "C", "D", "E"), Claims = c(0L, 
0L, 2L, 6L, 7L), Adds = c(10L, 17L, 16L, 15L, 12L), Family = c(1L, 
1L, 2L, 1L, 3L), Individual = c(9L, 9L, 5L, 6L, 9L), ES = c(6L, 
2L, 6L, 6L, 8L), SO = c(4L, 6L, 4L, 4L, 6L)), class = "data.frame",
row.names = c(NA, 
-5L))

另一種選擇,使用tidyr::pivot_*

library(dplyr)    # rename, %>%
library(tidyr)    # pivot_*
pivot_longer(dat, -Type) %>%
  pivot_wider(name, names_from="Type", values_from="value") %>%
  rename(Type=name)
# # A tibble: 6 x 6
#   Type           A     B     C     D     E
#   <chr>      <int> <int> <int> <int> <int>
# 1 Claims         0     0     2     6     7
# 2 Adds          10    17    16    15    12
# 3 Family         1     1     2     1     3
# 4 Individual     9     9     5     6     9
# 5 ES             6     2     6     6     8
# 6 SO             4     6     4     4     6

我同意這樣的觀點,即如果不是所有內容都相同 class(此處為integer ),那么列將被轉換為另一個 class。 例如,如果我們添加一個字符串列:

dat$QX <- "A"

那么我們的樞軸/轉置努力受到挫敗,原因很充分:

pivot_longer(dat, -Type) %>%
  pivot_wider(name, names_from="Type", values_from="value") %>%
  rename(Type=name)
# Error: Can't combine `Claims` <integer> and `QX` <character>.
# Run `rlang::last_error()` to see where the error occurred.

如果這是您已知的事情,請考慮在旋轉之前預先轉換為“更高”的 class(此處為字符串)。

dat %>%
  mutate_if(Negate(is.character), as.character) %>%
  pivot_longer(-Type) %>%
  pivot_wider(name, names_from="Type", values_from="value") %>%
  rename(Type=name)
# # A tibble: 7 x 6
#   Type       A     B     C     D     E    
#   <chr>      <chr> <chr> <chr> <chr> <chr>
# 1 Claims     0     0     2     6     7    
# 2 Adds       10    17    16    15    12   
# 3 Family     1     1     2     1     3    
# 4 Individual 9     9     5     6     9    
# 5 ES         6     2     6     6     8    
# 6 SO         4     6     4     4     6    
# 7 QX         A     A     A     A     A    

然后可以選擇將值轉換回integer或其他...認識到QX行肯定會有問題:-)

這是使用read.table的基本 R 選項

read.table(
  text = paste0(sapply(as.list(rbind(names(dat), dat)), toString), collapse = " \n"),
  header = TRUE,
  sep = ","
)

這使

        Type  A  B  C  D  E
1     Claims  0  0  2  6  7
2       Adds 10 17 16 15 12
3     Family  1  1  2  1  3
4 Individual  9  9  5  6  9
5         ES  6  2  6  6  8
6         SO  4  6  4  4  6

數據

> dput(dat)
structure(list(Type = c("A", "B", "C", "D", "E"), Claims = c(0L, 
0L, 2L, 6L, 7L), Adds = c(10L, 17L, 16L, 15L, 12L), Family = c(1L,
1L, 2L, 1L, 3L), Individual = c(9L, 9L, 5L, 6L, 9L), ES = c(6L,
2L, 6L, 6L, 8L), SO = c(4L, 6L, 4L, 4L, 6L)), class = "data.frame", row.names = c(NA,
-5L))

data.table選項正在使用fread

> fread(text = paste0(sapply(as.list(rbind(names(dat), dat)), toString), collapse = " \n"))
         Type  A  B  C  D  E
1:     Claims  0  0  2  6  7
2:       Adds 10 17 16 15 12
3:     Family  1  1  2  1  3
4: Individual  9  9  5  6  9
5:         ES  6  2  6  6  8
6:         SO  4  6  4  4  6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM