问题
This post is a following up of Changing line color in ggplot based on "several factors" slope
I would like to group the data (bellow) by "PQ", however I get the following error:
"incompatible size (0), expecting 1 (the group size) or 1"
Data
ID<-c("A_P1","A_P1","A_P1","A_P1","A_P1","A_P2","A_P2","A_P2","A_P2","A_P2","A_P2","B_P1","B_P1","B_P1","B_P1","B_P1","B_P1","B_P1","B_P1","B_P2","B_P2","B_P2","B_P2","B_P2","B_P2","B_P2","B_P2")
Q<-c("C1","C1","C2","C3","C3","C1","C1","C2","C2","C3","C3","Q1","Q1","Q1","Q1","Q3","Q3","Q4","Q4","Q1","Q1","Q1","Q1","Q3","Q3","Q4","Q4")
PQ<-c("A_P1C1","A_P1C1","A_P1C2","A_P1C3","A_P1C3","A_P2C1","A_P2C1","A_P2C2","A_P2C2","A_P2C3","A_P2C3","B_P1Q1","B_P1Q1","B_P1Q1","B_P1Q1","B_P1Q3","B_P1Q3","B_P1Q4","B_P1Q4","B_P2Q1","B_P2Q1","B_P2Q1","B_P2Q1","B_P2Q3","B_P2Q3","B_P2Q4","B_P2Q4")
AS<-c("CF","CF","CF","CF","CF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF","CTF")
N<-c("N2","N3","N3","N2","N3","N2","N3","N2","N3","N2","N3","N0","N1","N2","N3","N1","N3","N0","N1","N0","N1","N2","N3","N1","N3","N0","N1")
Value<-c(4.7,8.61,8.34,5.89,8.36,1.76,2.4,5.01,2.12,1.88,3.01,2.4,7.28,4.34,5.39,11.61,10.14,3.02,9.45,8.8,7.4,6.93,8.44,7.37,7.81,6.74,8.5)
df<-data.frame(ID=ID,Q=Q,PQ=PQ,AS=AS,N=N,Value=Value)
Code that is delivering the error
#calculate slopes for N0 and N1
df %>%
filter(N=="N0" | N=="N1") %>%
group_by(PQ) %>%
# use diff to calculate slope
mutate(slope = diff(Value)) -> dat01
#calculate slopes for N0 and N2
df %>%
filter(N=="N0" | N=="N2") %>%
group_by(PQ) %>%
# use diff to calculate slope
mutate(slope = diff(Value)) -> dat02
Additionally, I would like to calculate the slope of the the remaining "PQ" factors (when existent), i.e. N0-N3;N1-N2 ... and so on
回答1:
The error is due to the difference in length from the output of diff
with respect to the original dataset. It returns one element less than the original data. So appending a 0 or NA will solve the issue
df %>%
filter(N=="N0" | N=="N1") %>%
group_by(PQ) %>%
mutate(slope = c(0, diff(Value)))
To make it compact, instead of ==
, we can use %in%
when there are multiple elements
df %>%
filter(N %in% paste0("N", 0:1)) %>%
group_by(PQ) %>%
mutate(slope = c(0, diff(Value)))
Regarding the second issue, about doing this for all the combinations in 'N', use the combn
on the unique
elements of 'N', filter
the 'N' based on the combination values, after grouping by 'PQ', calculate the diff
of 'Value'. The output will be a list
as we specified simplify = FALSE
.
combn(as.character(unique(df$N)),2, FUN = function(x) df %>%
filter(N %in% x) %>%
group_by(PQ) %>%
mutate(slope = c(0, diff(Value))), simplify = FALSE )
来源:https://stackoverflow.com/questions/39036198/group-factorial-data-with-multiple-factors-error-incompatible-size-0-expe