簡體   English   中英

R 中的 pivot_wider 具有多列,但將以前的變量名稱保留在單獨的列中

[英]pivot_wider in R with multiple columns, but keep the name of former variables in separate columns

假設我希望通過不同的 setosa-ID 將數據放入寬格式。

iris2 <- iris %>%
          head(10) %>%
          mutate(num = 1:10,
          ID = str_c(Species,1:10))

       Sepal.Length Sepal.Width Petal.Length Petal.Width Species num       ID
1           5.1         3.5          1.4         0.2     setosa   1  setosa1
2           4.9         3.0          1.4         0.2     setosa   2  setosa2
3           4.7         3.2          1.3         0.2     setosa   3  setosa3
4           4.6         3.1          1.5         0.2     setosa   4  setosa4
5           5.0         3.6          1.4         0.2     setosa   5  setosa5
6           5.4         3.9          1.7         0.4     setosa   6  setosa6
7           4.6         3.4          1.4         0.3     setosa   7  setosa7
8           5.0         3.4          1.5         0.2     setosa   8  setosa8
9           4.4         2.9          1.4         0.2     setosa   9  setosa9
10          4.9         3.1          1.5         0.1     setosa  10  setosa10

然而,pivot_wider 為結果返回某種對角矩陣

iris3 <- iris2 %>%
  pivot_wider(names_from = ID,
              values_from = c(Sepal.Length,Sepal.Width,Petal.Length,Petal.Width))

   Species   num Sepal.Length_se~ Sepal.Length_se~ Sepal.Length_se~ Sepal.Length_se~ Sepal.Length_se~ Sepal.Length_se~
   <fct>   <int>            <dbl>            <dbl>            <dbl>            <dbl>            <dbl>            <dbl>
 1 setosa      1              5.1             NA               NA               NA                 NA             NA  
 2 setosa      2             NA                4.9             NA               NA                 NA             NA  
 3 setosa      3             NA               NA                4.7             NA                 NA             NA  
 4 setosa      4             NA               NA               NA                4.6               NA             NA  
 5 setosa      5             NA               NA               NA               NA                  5             NA  
 6 setosa      6             NA               NA               NA               NA                 NA              5.4

我希望數據變成這樣:

iris_want <- tibble("Species" = rep("setosa",40),
                    "num" = rep(1:10,each=4),
                    "Values_From" = rep(c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width"),10),
                    "setosa1" = NA,
                    "setosa2" = NA
)
   Species   num Values_From  setosa1 setosa2
   <chr>   <int> <chr>        <lgl>   <lgl>  
 1 setosa      1 Sepal.Length NA      NA     
 2 setosa      1 Sepal.Width  NA      NA     
 3 setosa      1 Petal.Length NA      NA     
 4 setosa      1 Petal.Width  NA      NA     
 5 setosa      2 Sepal.Length NA      NA     
 6 setosa      2 Sepal.Width  NA      NA     
 7 setosa      2 Petal.Length NA      NA     
 8 setosa      2 Petal.Width  NA      NA     
 9 setosa      3 Sepal.Length NA      NA     
10 setosa      3 Sepal.Width  NA      NA  

我該如何解決這個問題?

也許這可以幫助:

library(dplyr)
library(tidyr)
#Code
#Code
iris2 %>% pivot_longer(-c(Species,num,ID)) %>%
  pivot_wider(names_from = ID,values_from=value)

Output:

# A tibble: 40 x 13
   Species   num name  setosa1 setosa2 setosa3 setosa4 setosa5 setosa6 setosa7 setosa8
   <fct>   <int> <chr>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
 1 setosa      1 Sepa~     5.1    NA      NA        NA      NA      NA      NA      NA
 2 setosa      1 Sepa~     3.5    NA      NA        NA      NA      NA      NA      NA
 3 setosa      1 Peta~     1.4    NA      NA        NA      NA      NA      NA      NA
 4 setosa      1 Peta~     0.2    NA      NA        NA      NA      NA      NA      NA
 5 setosa      2 Sepa~    NA       4.9    NA        NA      NA      NA      NA      NA
 6 setosa      2 Sepa~    NA       3      NA        NA      NA      NA      NA      NA
 7 setosa      2 Peta~    NA       1.4    NA        NA      NA      NA      NA      NA
 8 setosa      2 Peta~    NA       0.2    NA        NA      NA      NA      NA      NA
 9 setosa      3 Sepa~    NA      NA       4.7      NA      NA      NA      NA      NA
10 setosa      3 Sepa~    NA      NA       3.2      NA      NA      NA      NA      NA
# ... with 30 more rows, and 2 more variables: setosa9 <dbl>, setosa10 <dbl>

看起來您需要先使數據變長( pivot_longer )然后再變寬。 此外,似乎num列不值得保留。 如果要保留num列,請從下面的代碼中刪除select(-num) %>%

iris2 %>%
    select(-num) %>%
    pivot_longer(cols = Sepal.Length:Petal.Width) %>%
    pivot_wider(names_from = ID, values_from = value)

  Species name         setosa1 setosa2 setosa3
  <fct>   <chr>          <dbl>   <dbl>   <dbl>
1 setosa  Sepal.Length     5.1     4.9     4.7 ...
2 setosa  Sepal.Width      3.5     3       3.2 ...
3 setosa  Petal.Length     1.4     1.4     1.3 ...
4 setosa  Petal.Width      0.2     0.2     0.2 ...

我們可以使用recast中的reshape2

library(reshape2)
recast(iris2, id.var = c("Species", "num", "ID"), 
       Species + num + variable ~ ID, value.var = 'value')

-輸出

# Species num     variable setosa1 setosa10 setosa2 setosa3 setosa4 setosa5 setosa6 setosa7 setosa8 setosa9
#1   setosa   1 Sepal.Length     5.1       NA      NA      NA      NA      NA      NA      NA      NA      NA
#2   setosa   1  Sepal.Width     3.5       NA      NA      NA      NA      NA      NA      NA      NA      NA
#3   setosa   1 Petal.Length     1.4       NA      NA      NA      NA      NA      NA      NA      NA      NA
#4   setosa   1  Petal.Width     0.2       NA      NA      NA      NA      NA      NA      NA      NA      NA
#5   setosa   2 Sepal.Length      NA       NA     4.9      NA      NA      NA      NA      NA      NA      NA
#6   setosa   2  Sepal.Width      NA       NA     3.0      NA      NA      NA      NA      NA      NA      NA
# ...

來自data.tabledcast + melt的組合可能有幫助

iris3 <- dcast(melt(setDT(iris2), id = c("Species", "num", "ID")), ... ~ ID, value.var = "value")

這樣

> head(iris3)
   Species num     variable setosa1 setosa10 setosa2 setosa3 setosa4 setosa5
1:  setosa   1 Sepal.Length     5.1       NA      NA      NA      NA      NA
2:  setosa   1  Sepal.Width     3.5       NA      NA      NA      NA      NA
3:  setosa   1 Petal.Length     1.4       NA      NA      NA      NA      NA
4:  setosa   1  Petal.Width     0.2       NA      NA      NA      NA      NA
5:  setosa   2 Sepal.Length      NA       NA     4.9      NA      NA      NA
6:  setosa   2  Sepal.Width      NA       NA     3.0      NA      NA      NA
   setosa6 setosa7 setosa8 setosa9
1:      NA      NA      NA      NA
2:      NA      NA      NA      NA
3:      NA      NA      NA      NA
4:      NA      NA      NA      NA
5:      NA      NA      NA      NA
6:      NA      NA      NA      NA

暫無
暫無

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

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