我很难理解 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 这个,但我还没有想出一个不输出垃圾列的合理方法。可能有一种相对简单的方法可以做到这一点,我只是想念它。
学习
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))
我们可以使用
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>