[英]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.