重新排列R中的数据以获取每组条件的变量值

时间:2018-07-17 16:39:36

标签: r

我有一个数据集,其中每个具有特定“刺激”条件的“受试者”对于变量“ FOXP3”,“ GATA3”和“ GZMB”具有特定值。我想将“主题”和“刺激”组合在一起,以获得“ FOXP3”,“ GATA3”和“ GZMB”的相应值。

所以数据看起来像这样:

subject   stim    FOXP3  GATA3  GZMB
TA        no stim   0      0.50   0
SA        11002     1       0     0.9
RK        4512      0.3     0.5   0.9

我希望数据看起来像这样

            TA+no stim      SA+11002       RK+4512   
FOXP3        0                 1             0.3
GATA3        0.5               0             0.5 
GZMB         0                 0.9           0.9

我该怎么做?

2 个答案:

答案 0 :(得分:0)

这就是我要做的:

library(dplyr)
library(tidyr)
df <- read.table(text = 
"subject   stim    FOXP3  GATA3  GZMB
TA        no-stim   0      0.50   0
SA        11002     1       0     0.9
RK        4512      0.3     0.5   0.9", header = T)
df2 <- df %>% unite(col = subject_stim, subject, stim, sep = "+") %>% 
{as_tibble(cbind(names = names(.), t(.)))} 
colnames(df2)[2:4] <- df2[1,2:4]
df3 <- df2[-1,]

它不是最漂亮,但可以工作。 as_tibble(cbind(names = names(.), t(.)))来自此question

答案 1 :(得分:0)

使用data.table,您可以分两步使用meltdcast

## first melt
df1 <- melt(data = df, id.vars = c('subject','stim'))
df1$col_name = paste(df1$subject,df1$stim, sep = '+')

## then spread
df1 <- dcast(df1, variable ~ col_name, value.var = 'value')
print(df1)

     variable RK+4512 SA+11002 TA+no_stim
1:    FOXP3     0.3      1.0        0.0
2:    GATA3     0.5      0.0        0.5
3:     GZMB     0.9      0.9        0.0