Установить несколько условий в функции - PullRequest
0 голосов
/ 13 апреля 2020

Для каждой последовательности я хочу получить разницу между A / A0 и B / B0 при рассмотрении id. Я сделал функцию для запуска этой последовательности. Но я мог бы сделать, чтобы иметь возможность изменить trt в функции?

rm(list=ls())
    id <- rep(1:6, each=4)
    trt <- c("A","A0","B","B0","B","B0","A","A0","A","A0","B","B0","B","B0","A","A0","A","A0","B","B0","B","B0","A","A0")
    seq <- rep(rep(1:2,each=2),6)
    set.seed(1)
    q <- runif(24)
    df <- data.frame(id,trt,seq,q)
    df

 id trt seq          q
1   1   A   1 0.26550866
2   1  A0   1 0.37212390
3   1   B   2 0.57285336
4   1  B0   2 0.90820779
5   2   B   1 0.20168193
6   2  B0   1 0.89838968
7   2   A   2 0.94467527
8   2  A0   2 0.66079779
9   3   A   1 0.62911404
10  3  A0   1 0.06178627
11  3   B   2 0.20597457
12  3  B0   2 0.17655675
13  4   B   1 0.68702285
14  4  B0   1 0.38410372
15  4   A   2 0.76984142
16  4  A0   2 0.49769924
17  5   A   1 0.71761851
18  5  A0   1 0.99190609
19  5   B   2 0.38003518
20  5  B0   2 0.77744522
21  6   B   1 0.93470523
22  6  B0   1 0.21214252
23  6   A   2 0.65167377
24  6  A0   2 0.12555510

test <- function(i) {
  df1 <- df[df$seq==i,]
  dfA <-  df1[df1$trt %in% c("A", "A0"),] 
  dfA <- dfA[,c(1,2,4)]
  library(tidyr)
  colnames(dfA)
  dfA <- spread(dfA,trt,q)
  dfA <- c(dfA[,2]-dfA[,3])
  return(dfA)
}
test(1)
test(2) 

Я думал что-то вроде этого, но это сработало

test <- function(i,df$trt[m],df$trt[n]) {
      df1 <- df[df$seq==i,]
      dfA <-  df1[df1$trt %in% c(m, n),] 
      dfA <- dfA[,c(1,2,4)]
      library(tidyr)
      colnames(dfA)
      dfA <- spread(dfA,trt,q)
      dfA <- c(dfA[,2]-dfA[,3])
      return(dfA)
    }
test(1,2,3)

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Мы можем arrange данные по id и trt, так что A0 после A и то же самое для B, group_by id и seq и вычислить разницу.

library(dplyr)

df %>% arrange(id, trt) %>% group_by(id, seq) %>% summarise(q = diff(q))
0 голосов
/ 13 апреля 2020

Опция с data.table

library(data.table)
setDT(df)[order(id, trt),  .(q = diff(q)), .(id, seq)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...