Извлечение пар общих значений для нескольких фреймов данных для создания нового бинарного фрейма данных на их основе - PullRequest
0 голосов
/ 09 октября 2018

У меня есть 3 кадра данных

Drug<-c("ab","bc","cd","ef","gh")
Target<-c("qwewr","saff","cxzcc","sadda","sadd")
fileA<-data.frame(Drug,Target)


Drug<-c("ab","bc","cdD","efc","ghg","hj")
Target<-c("qwewr","saff","cxzccf","saddav","sadd","bn")
fileB<-data.frame(Drug,Target)


Drug<-c("abB","bcv","cdD","efc")
Target<-c("qwewrm","saff","cxzccfh","saddav")
fileC<-data.frame(Drug,Target)

Как вы можете видеть, каждый из них содержит пару "Наркотик" - "Цель".Каждый фрейм данных содержит только уникальные пары.Но вы можете найти точно такую ​​же пару в других фреймах данных.Чего я хочу добиться, так это создать новый фрейм данных, который будет извлекать все уникальные пары в первом столбце, а затем в трех других столбцах будет иметь fileA, fileB и fileC, которые будут заполнены 1, если парасуществует и 0, если пара не существует.Что-то вроде:

Pairs fileA fileB fileC
 1:    abqwewr     1     1     1
 2:     bcsaff     1     1     1
 3:    cdcxzcc     1     1     1
 4:    efsadda     1     1     1
 5:     ghsadd     1     1     0
 6:  cdDcxzccf     0     0     0
 7:  efcsaddav     0     0     0
 8:    ghgsadd     0     0     0
 9:       hjbn     0     0     0
10:  abBqwewrm     0     0     0
11:    bcvsaff     0     0     0
12: cdDcxzccfh     0     0     0

Но здесь кадр данных неверен, поскольку в первом столбце есть только название препарата, а в каждой строке должен быть хотя бы один 1.

Мой метод:

# Create composite dataset by combining all files
compositeDataD <- rbind(fileA,fileB,fileC)


# Get unique (drug, target) pairs
# Connect Drug Names and Target Gene Symbols into one vector of pairs
compositeDataD <- na.omit(compositeDataD)
DrugTargetPairsD <- paste(compositeDataD$Drug,compositeDataD$Target,sep="")
uniquePairsD<-unique(DrugTargetPairsD)

PairsA <- DrugTargetPairsD[1:nrow(na.omit(fileA))]
PairsB <- DrugTargetPairsD[1:nrow(na.omit(fileB))]
PairsC <- DrugTargetPairsD[1:nrow(na.omit(fileC))]

# Create binary matrix for unique (drug, target) pairs 


binaryA <- as.numeric(uniquePairsD %in% PairsA) # This function returns a binary value for each unique (Drug, Target) Pair compared with the content of file1
binaryB <- as.numeric(uniquePairsD %in% PairsB)
binaryC <- as.numeric(uniquePairsD %in% PairsC)


table33 <- data.table(Pairs=uniquePairsD,
                     fileA=binaryA,fileB=binaryB,
                     fileC=binaryC)

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Составьте список L из трех объектов и используйте lapply, чтобы вставить их столбцы вместе, а затем stack, чтобы создать фрейм данных из 2 столбцов с вставленными значениями и указателем того, из какого объекта он получен.Наконец, используйте table, чтобы обеспечить количество.

L <- mget(ls(pattern = "file"))
s <- stack(lapply(L, function(x) paste0(x[[1]], x[[2]])))
table(s)

, дающее:

            ind
values       fileA fileB fileC
  abBqwewrm      0     0     1
  abqwewr        1     1     0
  bcsaff         1     1     0
  bcvsaff        0     0     1
  cdcxzcc        1     0     0
  cdDcxzccf      0     1     0
  cdDcxzccfh     0     0     1
  efcsaddav      0     1     1
  efsadda        1     0     0
  ghgsadd        0     1     0
  ghsadd         1     0     0
  hjbn           0     1     0

Вариант этого состоит в том, чтобы выразить это как этот конвейер:

library(magrittr)
mget(ls(pattern = "file")) %>%
  lapply(function(x) paste0(x[[1]], x[[2]])) %>%
  stack %>%
  table
0 голосов
/ 09 октября 2018

данные:

Drug<-c("ab","bc","cd","ef","gh")
Target<-c("qwewr","saff","cxzcc","sadda","sadd")
fileA<-data.frame(I(Drug),I(Target))


Drug<-c("ab","bc","cdD","efc","ghg","hj")
Target<-c("qwewr","saff","cxzccf","saddav","sadd","bn")
fileB<-data.frame(I(Drug),I(Target))


Drug<-c("abB","bcv","cdD","efc")
Target<-c("qwewrm","saff","cxzccfh","saddav")
fileC<-data.frame(I(Drug),I(Target))

код:

all_list <- list(fileA, fileB, fileC)

all1 <- rbind(fileA,fileB,fileC)
all1 <- as.data.frame(unique(all1))

ans <- t(apply(all1, 1, function(drgT){ sapply(all_list, function(x) {(list(drgT) %in% unlist(apply(x,1,list), recursive = F))*1} ) }))
ans[rowSums(ans) == 1,] <- 0

cbind(all1, ans)

результат:

#   Drug  Target 1 2 3
#1    ab   qwewr 1 1 0
#2    bc    saff 1 1 0
#3    cd   cxzcc 0 0 0
#4    ef   sadda 0 0 0
#5    gh    sadd 0 0 0
#8   cdD  cxzccf 0 0 0
#9   efc  saddav 0 1 1
#10  ghg    sadd 0 0 0
#11   hj      bn 0 0 0
#12  abB  qwewrm 0 0 0
#13  bcv    saff 0 0 0
#14  cdD cxzccfh 0 0 0

обратите внимание:

  • пожалуйста, измените данные вашего примера / желаемый результат.
  • пожалуйста ОБРАЗОВАНИЕ самостоятельно на stringsAsFactors.
0 голосов
/ 09 октября 2018

Вы можете сначала создать пары, а затем объединить их, перенося столбец, из которого поступили данные:

Создайте столбец индикатора в каждом файле:

fileA$fileA <- 1
fileB$fileB <- 1
fileC$fileC <- 1

Создайтепары в каждом файле:

fileA$DrugTargetPair <- paste0(fileA$Drug, fileA$Target)
fileB$DrugTargetPair <- paste0(fileB$Drug, fileB$Target)
fileC$DrugTargetPair <- paste0(fileC$Drug, fileC$Target)

Выберите только столбец индикатора и столбец Пары:

fileA <- fileA[, c("DrugTargetPair", "fileA")]
fileB <- fileB[, c("DrugTargetPair", "fileB")]
fileC <- fileC[, c("DrugTargetPair", "fileC")]

Объедините столбец Пары, сохраните все пары с помощью all = T:

file_new <- merge(fileA, fileB, by = "DrugTargetPair", all = T)
file_new <- merge(file_new, fileC, by = "DrugTargetPair", all = T)
file_new[is.na(file_new)] <- 0

file_new
   DrugTargetPair fileA fileB fileC
1       abBqwewrm     0     0     1
2         abqwewr     1     1     0
3          bcsaff     1     1     0
4         bcvsaff     0     0     1
5         cdcxzcc     1     0     0
6       cdDcxzccf     0     1     0
7      cdDcxzccfh     0     0     1
8       efcsaddav     0     1     1
9         efsadda     1     0     0
10        ghgsadd     0     1     0
11         ghsadd     1     0     0
12           hjbn     0     1     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...