web-dev-qa-db-fra.com

Faire correspondre plusieurs colonnes sur différents cadres de données et obtenir une autre colonne comme résultat

J'ai deux grandes trames de données, une (df1) a cette structure

   chr    init
1  12  25289552
2   3 180418785
3   3 180434779

L'autre (df2) a ceci

    V1    V2     V3
10  1     69094 medium
11  1     69094 medium
12  12 25289552 high
13  1     69095 medium
14  3 180418785 medium
15  3 180434779 low

Ce que j'essaie de faire est d'ajouter la colonne V3 de df2 à df1, pour obtenir les informations sur la mutation.

   chr    init  Mut
1  12  25289552 high
2   3 180418785 medium
3   3 180434779 low

J'essaie de charger les deux dans R puis de faire une boucle for en utilisant match, mais cela ne fonctionne pas. Connaissez-vous une manière spéciale de faire cela? Je suis aussi ouvert à utiliser awk ou quelque chose de similaire

11
user976991

Utilisez merge

df1 <- read.table(text='  chr    init
1  12  25289552
2   3 180418785
3   3 180434779', header=TRUE)


df2 <- read.table(text='    V1    V2     V3
10  1     69094 medium
11  1     69094 medium
12  12 25289552 high
13  1     69095 medium
14  3 180418785 medium
15  3 180434779 low', header=TRUE)


merge(df1, df2, by.x='init', by.y='V2') # this works!
       init chr V1     V3
1  25289552  12 12   high
2 180418785   3  3 medium
3 180434779   3  3    low

Pour obtenir le résultat souhaité comme vous le montrez 

output <- merge(df1, df2, by.x='init', by.y='V2')[, c(2,1,4)]
colnames(output)[3] <- 'Mut' 
output
  chr      init    Mut
1  12  25289552   high
2   3 180418785 medium
3   3 180434779    low
13
Jilber Urbina
df1 <- read.table(textConnection("   chr    init
 1  12  25289552
 2   3 180418785
 3   3 180434779"), header=T)

df2 <- read.table(textConnection("    V1    V2     V3
 10  1     69094 medium
 11  1     69094 medium
 12  12 25289552 high
 13  1     69095 medium
 14  3 180418785 medium
 15  3 180434779 low"), header=T)

# You have to select the values of df2$V3 such as their corresponding V2 
# are equal to the values of df1$init
df1$Mut <- df2$V3[ df2$V2 %in% df1$init]

df1
  chr      init    Mut
1  12  25289552   high
2   3 180418785 medium
3   3 180434779    low
3
plannapus

@ user976991 comment a fonctionné pour moi. 

Même idée mais nécessité de faire correspondre deux colonnes.

Le contexte de mon domaine est une base de données de produits avec plusieurs entrées (potentiellement des entrées de prix). Vous voulez supprimer les anciens update_nums et ne conserver que les plus récents par product_id.

raw_data <- data.table( product_id = sample(10:13, 20, TRUE), update_num = sample(1:3, 20, TRUE), stuff = rep(1, 20, sep = ''))
max_update_nums <- raw_data[ , max(update_num), by = product_id]
distinct(merge(dt, max_update_nums, by.x = c("product_id", "update_num"), by.y = c("product_id", "V1")))
0
Eric Rohlfs

Est-ce que

df3 <- merge( df1, df2, by.x = "init", by.y = "V2" )
df3 <- df3[-3]
colnames( df3 )[3] <- "Mut"

te donner ce que tu veux?

0
vaettchen