R数据框-根据两个变量提取一对行,然后根据自定义colwise函数合并行

时间:2019-05-29 07:57:40

标签: r dataframe dplyr

尝试基于样本对在其样本类型之一或两者中具有TRUE或FALSE布尔值来合并样本对及其变量。有些样品可能只有一种样品类型,但永远不会超过1 A和1 B类型样品。

对于以下数据框:

   a     b     c      d      e     f      g     h      samples_name sample_type
1  FALSE FALSE FALSE  FALSE  FALSE TRUE   FALSE FALSE  PAEEYP         A
2  FALSE TRUE  FALSE  FALSE  FALSE FALSE  FALSE FALSE  PAEEYP         B
3  FALSE FALSE FALSE  FALSE  FALSE FALSE  FALSE TRUE   PAERAH         A
4  FALSE FALSE FALSE  FALSE  FALSE FALSE  FALSE TRUE   PAERAH         B
5  FALSE FALSE FALSE  TRUE   TRUE  FALSE  FALSE FALSE  PAKIYW         A  \\only has A sample

4个可能的值1)FALSE =均为FALSE; 2)仅在A中A = TRUE; 3)B =仅在B中为TRUE,4)TRUE =均为TRUE

   a     b     c      d      e     f      g     h      samples_name
1  FALSE B     FALSE  FALSE  FALSE A      FALSE FALSE  PAEEYP         
2  FALSE FALSE FALSE  FALSE  FALSE FALSE  FALSE TRUE   PAERAH         
3  FALSE FALSE FALSE  A      A     FALSE  FALSE FALSE  PAKIYW    

我被困住了,不知道该怎么做。我想我需要按样本名称对它们进行子集/分组,根据样本类型对其进行排序,然后在合并到数据帧之前,在每个子集/组中应用一些colwise ifelse函数。我考虑过使用ddply进行子设置并应用colwise函数,但是我无法理解。我想我以某种方式对此问题进行了思考,将不胜感激。

1 个答案:

答案 0 :(得分:2)

我遇到了一些问题,因为您想要的输出混合了逻辑和字符...

这种解决方案不是最漂亮的。它被黑掉了;-)。
但这也许会为您设定正确的方向,或者激发其他人提供更好的答案...

样本数据

library( data.table )

DT <- fread("a     b     c      d      e     f      g     h      samples_name sample_type
  FALSE FALSE FALSE  FALSE  FALSE TRUE   FALSE FALSE  PAEEYP         A
  FALSE TRUE  FALSE  FALSE  FALSE FALSE  FALSE FALSE  PAEEYP         B
  FALSE FALSE FALSE  FALSE  FALSE FALSE  FALSE TRUE   PAERAH         A
  FALSE FALSE FALSE  FALSE  FALSE FALSE  FALSE TRUE   PAERAH         B
  FALSE FALSE FALSE  TRUE   TRUE  FALSE  FALSE FALSE  PAKIYW         A")

代码

#melt to long
DT.melt <- melt( DT, id.vars = c( "samples_name", "sample_type" ) )
#set TRUE/FALSE to 1/0
DT.melt[, value := as.numeric( value )]
#only keep roes where value > 0
ans <- DT.melt[ !value == 0, ]
ans <- ans[, .(total = paste0(sample_type, collapse = "")), by = .(samples_name, variable)]
ans[ total == "AB", total := "TRUE"]
#    samples_name variable total
# 1:       PAEEYP        b     B
# 2:       PAKIYW        d     A
# 3:       PAKIYW        e     A
# 4:       PAEEYP        f     A
# 5:       PAERAH        h  TRUE

#create new melt without the sample_type
DT.melt2 <- melt( DT, id.vars = c( "samples_name" ), measure.vars = patterns("^[a-h]$") )
#set value to character, drop duplicates
DT.melt2 <- unique( DT.melt2[, value := as.character(value)], by = c("samples_name", "variable"))
#update join answer
DT.melt2[ ans, value := i.total, on = .(samples_name, variable)]
#and cast back to wide format
dcast(DT.melt2, samples_name ~ variable, value.var = "value")

输出

#    samples_name     a     b     c     d     e     f     g     h
# 1:       PAEEYP FALSE     B FALSE FALSE FALSE     A FALSE FALSE
# 2:       PAERAH FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
# 3:       PAKIYW FALSE FALSE FALSE     A     A FALSE FALSE FALSE