如何在R中用dplyr/tidyr拼接两数据框对应列值生成新数据框
嘿,这个需求用dplyr就能轻松实现,我给你一步步拆解:
第一步:先构造示例数据
首先咱们先把你给出的data1和data2用代码还原出来(用tibble比基础的data.frame更整洁):
library(dplyr) data1 <- tibble( LEVEL = c("L1", "L2"), V1 = c("a", "b"), V2 = c("c", "d") ) data2 <- tibble( LEVEL = c("L1", "L2"), V1 = c("1", "2"), V2 = c("3", "4") )
第二步:合并并拼接列值
核心思路是先通过LEVEL列把两个数据框合并,再把对应列的内容用下划线拼接起来:
data3 <- data1 %>% # 按LEVEL合并,给重名列加后缀区分 inner_join(data2, by = "LEVEL", suffix = c("_from1", "_from2")) %>% # 对V1、V2列进行拼接 mutate( V1 = paste(V1_from1, V1_from2, sep = "_"), V2 = paste(V2_from1, V2_from2, sep = "_") ) %>% # 只保留需要的列 select(LEVEL, V1, V2) # 查看最终结果 data3
运行后你会得到完美符合需求的data3:
# A tibble: 2 × 3 LEVEL V1 V2 <chr> <chr> <chr> 1 L1 a_1 c_3 2 L2 b_2 d_4
进阶技巧:批量处理多列
如果你有很多类似V1、V2的列(比如V3、V4...),一个个写太麻烦,可以用across批量处理:
data3 <- data1 %>% inner_join(data2, by = "LEVEL", suffix = c("_1", "_2")) %>% mutate( # 批量处理所有以V开头的列 across(starts_with("V"), ~paste( get(paste0(cur_column(), "_1")), get(paste0(cur_column(), "_2")), sep = "_" )) ) %>% select(LEVEL, starts_with("V"))
这样不管有多少个V开头的列,都能自动完成拼接,非常高效!
内容的提问来源于stack exchange,提问作者Rajarshi Bhadra
相关产品推荐
相关产品推荐

