我怀疑您在df
的构造中混淆了“前置” /“前置”顺序?有了它的方式,您没有“ subject1”的“ post”或“ subject2”的“ pre”。
您可以这样做:
df <- data.frame(subject = c('subject1','subject1','subject2','subject2'),varA = c(1,2,1,3),varB = c(2,3,4),timepoint = c('pre','post','pre','post'),stringsAsFactors = FALSE)
df1 <- df %>%
group_by(subject) %>%
summarise(varA = varA[timepoint=='post'] / varA[timepoint=='pre'],varB = varB[timepoint=='post'] / varB[timepoint=='pre'],timepoint = 'foldchange')
df_foldchange <- df %>%
bind_rows(df1) %>%
arrange(subject)
# output
subject varA varB timepoint
1 subject1 1 2.0 pre
2 subject1 2 3.0 post
3 subject1 2 1.5 foldchange
4 subject2 1 2.0 pre
5 subject2 3 4.0 post
6 subject2 3 2.0 foldchange
如果顺序很重要,则可以对上面的内容进行排序以获得所需的输出。
,
使用data.table
,您可以执行以下操作:
df <- data.frame(subject = c('subject1','post'))
library(data.table)
setDT(df)#converting data frame into data.table
df2<- df[,lapply(.SD,function(x) x[timepoint=="post"]/x[timepoint=="pre"]),subject,.SDcols=varA:varB] #performing computation per columns requiered
df2[,timepoint:="foldchange"] #adding variable "foldchange"
df_foldchange <- rbind(df,df2) #binding per row
df_foldchange[order(subject)]
#output
subject varA varB timepoint
1: subject1 1 2.0 pre
2: subject1 2 3.0 post
3: subject1 2 1.5 foldchange
4: subject2 1 2.0 pre
5: subject2 3 4.0 post
6: subject2 3 2.0 foldchange
本文链接:https://www.f2er.com/3109311.html