簡體   English   中英

如何在 R 中重塑我的數據框(轉置、選擇、刪除行)?

[英]how to reshape my data frame in R (transpose, select, remove row)?

這是我有的數據框(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")

暫無
暫無

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

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