dplyr如果列存在则重命名else

xuo3flqw  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(160)

我正在尝试构建一个能够处理各种输入类型的管道。我将_join保留给了一个主表,该表***可能***具有相同的列名。dplyr会在连接表中将匹配的列名追加为.x和.y。我希望重命名源自主表的列(.y)到它的原始名称。管道必须为input1和input2工作(作为独立的输入)。目前我的重命名步骤抛出和错误。我也尝试了mutate(),但给出了类似的错误。

> names(input1.df)
[1] "A"

> names(input2.df)
[1] "A" "B"

>names(MasterTable.df)
[1] "A" "B" "C" "D" "E"

joined.df <- input2.df %>%
  dplyr::left_join(MasterTable.df, by=("A")) %>%
  dplyr::rename(B = ifelse(B.y %in% names(.)) B.y, B) %>%
  dplyr::select(A, B) %>%
  dplyr::mutate(New_Column = ifelse(is.na(B), A, B))
sqxo8psd

sqxo8psd1#

您可以使用rename_with(.fn=)

input1.df <- data.frame(A=1)
input2.df <- data.frame(A=1, B=2)
MasterTable.df <- data.frame(A=1, B=2, C=3, D=4, E=5)
library(dplyr)
input2.df %>%
  left_join(MasterTable.df, by=("A")) %>%
  rename_with(.fn = ~ gsub("\\.y$", "", .))
#   A B.x B C D E
# 1 1   2 2 3 4 5

如果需要,您可以select(-ends_with(".x"))
~-func有点幼稚,因为它不检查非.y列是否已经存在,但在您的情况下,这似乎不是一个因素。
不过,也许还有一种不同的方法,那就是在连接时更改后缀:

input2.df %>%
  left_join(MasterTable.df, by=("A"), suffix=c(".x", ""))
#   A B.x B C D E
# 1 1   2 2 3 4 5
fhity93d

fhity93d2#

如果没有数据集和输出示例,我不确定我是否理解它,但我会给予一下:
为什么不在左连接后重命名.y或.x列?

joined.df <- left_join(MasterTable.df,input2.df, by=("A"))
names(joined.df) <- gsub(".y","",names(joined.df))
names(joined.df) <- gsub(".x","",names(joined.df))

相关问题