如何在R中重塑数据帧(转置、选择、移除行)

  • 本文关键字:选择 转置 数据帧 r
  • 更新时间 :
  • 英文 :


这是我拥有的数据帧(ttt(:

.id     dn     mavg    up      pctB
AA.1    18.8    21.1    23.4    0.8 
AA.2    18.7    21.1    23.5    0.8 
AA.3    18.7    21.2    23.7    0.8 
AAN.1   23.1    24.6    26.1    0.5 
AAN.2   23.1    24.6    26.0    0.4 
AAN.3   23.1    24.5    26.0    0.5 
AAP.1   145.5   179.2   212.9   0.3 
AAP.2   144.2   177.4   210.7   0.3 
AAP.3   143.4   175.6   207.7   0.3 

我想要的形状如下:

pctB.1  pctB.2  pctB.3
AA  0.8     0.8     0.8 
AAN 0.5     0.4     0.5 
AAP 0.3     0.3     0.3 

我唯一需要的栏是pctB。我试着写:

ttt <- ttt %>% select(1,5)
ttt <- do.call(cbind, split(ttt, ttt$`.id`))
ttt <- t(ttt)

它给出了一个我不想要的结果。我该怎么办?

<error/rlang_error>
`n()` must only be used inside dplyr verbs.
Backtrace:
1. plyr::mutate(., .id = sub("\..*", "", .id))
1. dplyr::group_by(., .id)
8. plyr::mutate(., col = paste0("pctB.", row_number()))
9. [ base::eval(...) ] with 1 more call
12. dplyr::row_number()
13. dplyr::n()
14. dplyr:::peek_mask("n()")
15. dplyr:::context_peek("mask", fun)
16. context_peek_bare(name) %||% abort(glue("`{fun}` must only be used inside {location}."))

您可以从中删除额外的字符,创建一个唯一的id列,并只选择感兴趣的列以宽格式获取数据。

library(dplyr)
library(tibble)
ttt %>%
mutate(.id = sub('\..*', '', .id)) %>%
group_by(.id) %>%
mutate(col = paste0('pctB.', row_number())) %>%
select(-(dn:up)) %>%
tidyr::pivot_wider(names_from = col, values_from = pctB)
#  .id   pctB.1 pctB.2 pctB.3
#  <chr>  <dbl>  <dbl>  <dbl>
#1 AA       0.8    0.8    0.8
#2 AAN      0.5    0.4    0.5
#3 AAP      0.3    0.3    0.3

数据

ttt <- structure(list(.id = c("AA.1", "AA.2", "AA.3", "AAN.1", "AAN.2", 
"AAN.3", "AAP.1", "AAP.2", "AAP.3"), dn = c(18.8, 18.7, 18.7, 
23.1, 23.1, 23.1, 145.5, 144.2, 143.4), mavg = c(21.1, 21.1, 
21.2, 24.6, 24.6, 24.5, 179.2, 177.4, 175.6), up = c(23.4, 23.5, 
23.7, 26.1, 26, 26, 212.9, 210.7, 207.7), pctB = c(0.8, 0.8, 
0.8, 0.5, 0.4, 0.5, 0.3, 0.3, 0.3)),class = "data.frame", row.names = c(NA, -9L))

.id拆分为两列(例如"AA.1"->"AA", "1"(,然后按这两列进行枢轴旋转。

library(tidyverse)
ttt %>%
mutate(.id.1 = str_split(.id, "\.") %>% map(~ .[[1]]) %>% unlist,
.id.2 = str_split(.id, "\.") %>% map(~ paste0("pctB.", .[[2]])) %>% unlist) %>%
pivot_wider(id_cols = .id.1,
names_from = .id.2,
values_from = pctB) %>%
column_to_rownames(".id.1")

最新更新