2017-10-15 4 views
0

# Data1Comment fusionner des colonnes avec des noms différents en utilisant la fonction "merge, by = Column.name"?

SampleID <- c("A-01","B-01","C-01") 
Value <- c(1,2,3) 
data1 <- data.frame(SampleID, Value) 

# Données2

SampleID <- c("A","B","C") 
Value1 <- c(3,4,5) 
data2 <- data.frame(SampleID,Value1) 

# Sortie: Ce que je veux est le suivant à l'aide: merge(data1, data2, by=c("SampleID"), all = TRUE)

SampleID Value Value1 
A-01  1  3 
B-01  2  4 
C-01  3  5 
+2

Utilisez des arguments '' by.x' et by.y'. –

+1

Donc vous voulez fusionner la ligne 'A-01' avec la ligne' A', etc? Si c'est le cas, vous devrez d'abord rendre ces valeurs égales, en créant une nouvelle colonne avec 'gsub'. –

Répondre

2

Vous pouvez d'abord diviser ID_échant de données1 et concaténer il.

SampleID <- c("A-01","B-01","C-01") 
Sample <- substr(SampleID,1,1) 
Num <- substr(SampleID,3,5) 
Value <- c(1,2,3) 
data1 <- data.frame(Sample ,Num, Value) 

SampleID <- c("A","B","C") 
Value1 <- c(3,4,5) 
data2 <- data.frame(SampleID, Value1) 

merged <- merge(data1, data2, by.x = "Sample", by.y = "SampleID", all = T) 
merged$SampleID <- paste(merged$Sample,merged$Num, sep = "-") 
merged <- merged[,c(5,3,4)] 

    SampleID Value Value1 
1  A-01  1  3 
2  B-01  2  4 
3  C-01  3  5 
1

Vous pouvez le faire en utilisant sqldf bibliothèque:

library(sqldf); 
sqldf("SELECT data1.SampledId, data1.Vlaue, data2.Value2 FROM data1 JOIN data2 on data1.SampleID like data1.SampleID + '-%'") 

Ou en utilisant data.table aime comme suit:

library(data.table) 
dt1 <- data.table(data1) 
dt2 <- data.table(data2) 
dt1[dt2, on = .(grepl(CustomerId, CustomerId)), all = TRUE] 
1

Je crois que ce qui suit fait ce que vous avez besoin.

data1$NewID <- gsub("[^[:alpha:]]", "", data1$SampleID) 
result <- merge(data1, data2, by.x = "NewID", by.y = "SampleID", all = TRUE) 
result <- result[-1] 
result 
# SampleID Value Value1 
#1  A-01  1  3 
#2  B-01  2  4 
#3  C-01  3  5 

Vous pouvez ensuite supprimer la colonne supplémentaire de data1 avec

data1 <- data1[-3] 
1

Pour ajouter à la collection, voici une solution dplyr qui lit un peu plus facile:

options(stringsAsFactors = F) 
SampleID <-c("A-01","B-01","C-01") 
Value <- c(1,2,3) 
data1 <- data.frame(SampleID, Value) 

SampleID <- c("A","B","C") 
Value1 <- c(3,4,5) 
data2 <- data.frame(SampleID,Value1) 

data1 %>% 
    mutate(new_id = gsub("[^[:alpha:]]", "", SampleID)) %>% 
    left_join(., data2, by = c("new_id" = "SampleID")) %>% 
    select(-new_id) 

    SampleID Value Value1 
1  A-01  1  3 
2  B-01  2  4 
3  C-01  3  5