数据帧上的传播函数,R中有重复项

时间:2018-04-11 13:08:14

标签: r tidyr

我试图以有效的方式将我的复制品从我的数据集中的结果中分离出来。我以此数据为例:

x <- data.frame(sample = c("AA", "AA", "BB", "BB", "CC", "CC"),
                Gene = c("HSA-let1","HSA-let1","HSA-let1","HSA-let1","HSA-let1","HSA-let1"),
                Cq = c(14.55, 14.45, 13.55, 13.45, 16.55, 16.45))

问题是两个重复项在“Sample”和“Gene”中具有相同的名称。所以当我尝试时:

spread(x,Gene,Cq)

我收到重复的标识符错误。我在下面尝试了this修复代码,它在一个coloumn中用“,”分隔了两个值。这几乎是成功的,但我希望它们分开:

x_test <- dcast(setDT(x), Gene ~ sample, value.var = 'Cq',
                fun.aggregate = function(x) toString(unique(x)))

我也尝试了这个this tidyr解决方案,但我不了解足够的R来使它工作。

x_test2 <- x %>% 
      gather(variable, value, -(Gene:Cq)) %>%
      unite(temp, Cq, variable) %>%
      spread(temp, value)

我希望我的数据集看起来像这样:

# Gene    AA_1   AA_2 BB_1   BB_2  CC_1  CC_2
# HSA-let 14.55 14.45 13.55 13.45 16.55 16.45

3 个答案:

答案 0 :(得分:2)

使样本独特,然后传播:

{{1}}

答案 1 :(得分:1)

您可以更改sample列:

library(data.table)

setDT(x)[, sample := paste(sample, ifelse(!duplicated(sample), '1', '2'), sep = '_')]
dcast(x, ...~sample, value.var = 'Cq')
#        Gene  AA_1  AA_2  BB_1  BB_2  CC_1  CC_2
# 1: HSA-let1 14.55 14.45 13.55 13.45 16.55 16.45

注意:spread应该被称为spread(x, sample, Cq)

修改

如果你有不同数量的重复值(不总是2),你可以这样做:

x <- setDT(x)[order(sample),]
x[, sample := paste(sample, unlist(lapply(table(x$sample), function(x) 1:x)), sep = '_')]
dcast(x, ...~sample, value.var = 'Cq')

请注意,x应按sample排序。

答案 2 :(得分:0)

你可以试试这个

library(dplyr)
x %>% group_by(Gene) %>%
  mutate(sample = paste(sample, seq(n()), sep = "_")) %>%
  spread(sample, Cq)