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
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
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
@ 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")))
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?