尝试基于样本对在其样本类型之一或两者中具有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函数,但是我无法理解。我想我以某种方式对此问题进行了思考,将不胜感激。
答案 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