匹配不同数据帧上的多列并获得其他列作为结果
Posted
技术标签:
【中文标题】匹配不同数据帧上的多列并获得其他列作为结果【英文标题】:Matching multiple columns on different data frames and getting other column as result 【发布时间】:2012-10-28 12:31:41 【问题描述】:我有两个大数据框,一个 (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
我要做的是将df2
的V3
列添加到df1
,以获取突变信息
chr init Mut
1 12 25289552 high
2 3 180418785 medium
3 3 180434779 low
我正在尝试将两者都加载到 R 中,然后使用 match 进行 for 循环,但它不起作用。你知道有什么特别的方法可以做到这一点吗?我也愿意使用 awk 或类似的东西
【问题讨论】:
【参考方案1】:当我最近遇到问题时,我最终在数据集中创建了一个新列并将其用作单个列来加入。
#create new column for join
df1$id <- paste0("chr" , "init")
df2$id <- paste0("V1","V2")
# join and select outputs
df3 <- dplyr::left_join(x = df1, y = df2, by = "id")%>%
dplyr::select(chr, init, V3)
它对我有用。
【讨论】:
【参考方案2】:@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")))
【讨论】:
【参考方案3】: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
【讨论】:
请注意,如果df1
中的任何键值在df2
中不存在,这将不起作用。您会收到类似“替换有 3 行,数据有 4 行”的错误。有关使用 match()
的左连接实现,请参阅 ***.com/questions/1299871/…。【参考方案4】:
使用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
【讨论】:
是的,这就是我想要的,关键是我还必须考虑染色体,所以也许像这样的东西 merge(df1, df2, by.x=c('chr', 'init'), by.y=c('V1',V2')[, c(2,1,4)] 没错,只需将chr
和V1
添加到参数中即可:D 考虑对有用的答案投赞成票,如果您觉得其中一个有用,请接受其中一个:D【参考方案5】:
会
df3 <- merge( df1, df2, by.x = "init", by.y = "V2" )
df3 <- df3[-3]
colnames( df3 )[3] <- "Mut"
给你你想要的?
【讨论】:
以上是关于匹配不同数据帧上的多列并获得其他列作为结果的主要内容,如果未能解决你的问题,请参考以下文章
SQL 来获取唯一键匹配但数据在不同表之间的某些其他列中不同的数据
Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容