2015-10-12 2 views
0

У меня 2 dataframesЗамена в data.frames в R

df1 #This one is in fact the mapping file (300 rows) 
Sample_title  Sample_geo_accession 
EC2003090503AA     GSM118720 
EC2003090502AA     GSM118721 
EC2003090504AA     GSM118722 

df2 #(300 rows) 
cmap_name concentration (M) perturbation_scan_id vehicle_scan_id3 
metformin 0.00001 EC2003090503AA EC2003090502AA 
metformin 0.00001 EC2003090504AA EC2003090502AA 
metformin 0.0000001 EC2003090503AA EC2003090502AA 

Я хочу, чтобы прочитать каждую строку в df2 и заменить perturbation_scan_id и vehicle_scan_id3 со стороны !Sample_geo_accession в df1.

Конечный результат будет:

df3 
cmap_name concentration_M perturbation_scan_id vehicle_scan_id3 
metformin 0.00001   GSM118720    GSM118721 
metformin 0.00001   GSM118722    GSM118721 
metformin 0.0000001  GSM118720    GSM118721 

ответ

2

Одно из возможных решений (если у вас есть многие из этих столбцов, которые вы хотите заменить), чтобы сначала создать индекс строки и «растопить» данные по cmap_name , concentration_M и новый индекс. Затем выполните одно слияние с новым столбцом value (который будет иметь все значения этого столбца в одном длинном столбце), а затем «разметьте» данные обратно в широкий формат. Вот возможная реализация data.table. Убедитесь, что у вас установлена ​​последняя версия CRAN. Я также имена столбцов больше «R дружественных» так будет легче работать с

library(data.table) # V 1.9.6+ 
temp <- melt(setDT(df2)[, indx := .I], id = c(1:2, 5))[df1, on = c(value = "Sample_title")] 
dcast(temp, cmap_name + concentration_M + indx ~ variable, value.var = "Sample_geo_accession") 
# cmap_name concentration_M indx perturbation_scan_id vehicle_scan_id3 
# 1: metformin   1e-07 3   GSM118720  GSM118721 
# 2: metformin   1e-05 1   GSM118720  GSM118721 
# 3: metformin   1e-05 2   GSM118722  GSM118721 

Похожая реализации dplyr/tidyr

library(dplyr) 
library(tidyr) 
df2 %>% 
    mutate(indx = row_number()) %>% 
    gather(variabe, value, -c(1:2, 5)) %>% 
    left_join(., df1, by = c("value" = "Sample_title")) %>% 
    select(-value) %>% 
    spread(variabe, Sample_geo_accession) 
+0

Благодаря @David я сделал это со слиянием, как а также предложил акрун. – user3253470

+0

вы можете мне помочь с этим вопросом: [http://stackoverflow.com/questions/36420909/compare-matrices-to-find-the-differences] – user3253470

+0

У вас только есть помощь, нет? –

Смежные вопросы