Group (factorial) data with multiple factors. error: incompatible size (0), expecting 1 (the group size) or 1

Group (factorial) data with multiple factors. error: incompatible size (0), expecting 1 (the group size) or 1

此 post 是

的后续

我想按 "PQ" 对数据(下面)进行分组,但是我收到以下错误:

"incompatible size (0), expecting 1 (the group size) or 1"

数据

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)

传递错误的代码

#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

此外,我想计算剩余 "PQ" 个因子(如果存在)的斜率,即 N0-N3;N1-N2 ... 等等

错误是由于 diff 的输出与原始数据集的长度不同造成的。它returns比原始数据少了一个元素。所以附加 0 或 NA 将解决问题

df %>% 
   filter(N=="N0" | N=="N1") %>%
   group_by(PQ) %>% 
   mutate(slope = c(0, diff(Value)))

为了紧凑,当有多个元素时,我们可以使用%in%代替==

df %>%
   filter(N %in%  paste0("N", 0:1)) %>%
   group_by(PQ) %>%
   mutate(slope = c(0, diff(Value)))

关于第二个问题,关于对'N'中的所有组合执行此操作,在'N'、[=18=的unique个元素上使用combn ] 'N'根据组合值,按'PQ'分组后,计算'Value'的diff。输出将是我们指定的 list 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 )