首页 > 解决方案 > 在一个函数中设置几个条件

问题描述

对于每个序列,我想在考虑 id 的同时获得 A/A0 和 B/B0 之间的差异。我做了一个函数来按序列运行它。但是我可以做些什么来改变函数中的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)

标签: r

解决方案


我们可以通过和arrange的数据,因此之后和 相同,并计算差异。idtrtA0ABgroup_by idseq

library(dplyr)

df %>% arrange(id, trt) %>% group_by(id, seq) %>% summarise(q = diff(q))

推荐阅读