Согласование нескольких столбцов на разных кадрах данных и получение другого столбца
Я получил два больших кадра данных, один (df1
) имеет эту структуру
chr init
1 12 25289552
2 3 180418785
3 3 180434779
Другой (df2
) имеет этот
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
То, что я пытаюсь сделать, - добавить столбец V3
от df2
до df1
, чтобы получить информацию о мутации
chr init Mut
1 12 25289552 high
2 3 180418785 medium
3 3 180434779 low
Я пытаюсь загрузить оба в R, а затем выполнить цикл for, используя совпадение, но он не работает. Вы знаете какой-нибудь особый способ сделать это? Я также открыт для использования awk или чего-то подобного
Ответы
Ответ 1
Используйте 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
Чтобы получить желаемый результат, как вы его показываете
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
Ответ 2
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
ли
df3 <- merge( df1, df2, by.x = "init", by.y = "V2" )
df3 <- df3[-3]
colnames( df3 )[3] <- "Mut"
дать вам то, что вы хотите?
Ответ 4
@user976991 комментарий работал на меня.
Та же идея, но нужно сопоставить две колонки.
Мой контекст домена - это база данных продуктов с несколькими записями (возможно, с ценами). Хотите отбросить старые update_nums и сохранить только самые последние по 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")))