沿多列投射长表

问题描述 投票:0回答:2

我很难理解 dcast,无法获得正确的命令来获得我想要的东西。我会给出一个最小的repro.

#generate the data
ID <- c('a','a','a','b','b','b')
Parameter <- c('p1','p2','p3','p1','p2','p3')
Value <- c('yes','no','3','yes','yes','2')
Comment <- c(NA,'Deduced','To verify',NA,'Deduced','Verified')
Source <- c('Exp.1','Exp.1','Exp.1+2','DB2','DB2','DB2')
Person <- c('X','X','X','Y','Y','Z')
long.data <- data.frame(ID,Parameter,Value,Comment,Source,Person)

  ID Parameter Value   Comment  Source Person
1  a        p1   yes      <NA>   Exp.1      X
2  a        p2    no   Deduced   Exp.1      X
3  a        p3     3 To verify Exp.1+2      X
6  b        p1   yes      <NA>     DB2      Y
7  b        p2   yes   Deduced     DB2      Y
8  b        p3     2  Verified     DB2      Y

我想把它变成下面的 wide.data 格式:

  ID Person  p1 p1-Comment p1-Source   p2 p2-Comment p2-Source p3 p3-Comment p3-Source
1  a      X yes       <NA>     Exp.1   no    Deduced     Exp.1  3  To verify   Exp.1+2
2  b      Y yes       <NA>       DB2  yes    Deduced       DB2  2   Verified       DB2

我可以假设每个 ID 都有相同的人。我相信我可以 dcast 这个,但我还没有想出一个不输出垃圾列的合理方法。可能有一种相对简单的方法可以做到这一点,我只是想念它。

r reshape reshape2 melt dcast
2个回答
0
投票

学习

reshape
.

reshape(long.data, timevar='Parameter', idvar='ID', direction='wide')
#   ID Value.p1 Comment.p1 Source.p1 Person.p1 Value.p2 Comment.p2 Source.p2 Person.p2 Value.p3 Comment.p3 Source.p3 Person.p3
# 1  a      yes       <NA>     Exp.1         X       no    Deduced     Exp.1         X        3  To verify   Exp.1+2         X
# 4  b      yes       <NA>       DB2         Y      yes    Deduced       DB2         Y        2   Verified       DB2         Z

资料:

long.data <- structure(list(ID = c("a", "a", "a", "b", "b", "b"), Parameter = c("p1", 
"p2", "p3", "p1", "p2", "p3"), Value = c("yes", "no", "3", "yes", 
"yes", "2"), Comment = c(NA, "Deduced", "To verify", NA, "Deduced", 
"Verified"), Source = c("Exp.1", "Exp.1", "Exp.1+2", "DB2", "DB2", 
"DB2"), Person = c("X", "X", "X", "Y", "Y", "Z")), class = "data.frame", row.names = c(NA, 
-6L))

0
投票

我们可以使用

pivot_wider

library(tidyr)
library(dplyr)
pivot_wider(long.data, names_from = Parameter,
   values_from = c(Value, Comment, Source ), 
     names_glue = "{Parameter}-{.value}", names_vary = "slowest")) %>% 
   filter(!is.na(`p1-Value`))

-输出

# A tibble: 2 × 11
  ID    Person `p1-Value` `p1-Comment` `p1-Source` `p2-Value` `p2-Comment` `p2-Source` `p3-Value` `p3-Comment` `p3-Source`
  <chr> <chr>  <chr>      <chr>        <chr>       <chr>      <chr>        <chr>       <chr>      <chr>        <chr>      
1 a     X      yes        <NA>         Exp.1       no         Deduced      Exp.1       3          To verify    Exp.1+2    
2 b     Y      yes        <NA>         DB2         yes        Deduced      DB2         <NA>       <NA>         <NA>            
© www.soinside.com 2019 - 2024. All rights reserved.