r - 如何加入 ColumnA = (ColumnB - 1)
问题描述
我正在尝试加入两个数据框。连接的条件不是 ColumnA=ColumnB 而是 ColumnA=ColumnB*Function。使用函数合并,我不知道如何处理它
有一个例子,
df1 <- data.frame(ID=c(5,4,3,2), CASE=c("A","B","C","D"))
df2 <- data.frame(ID=c(6,5,4,3), RESULT=c("ResultA","ResultB","ResultC","ResultD"))
我想用df1$ID = df2$ID - 1之类的东西加入 df1 和 df2 ,得到结果:
df_result<- data.frame(ID_df1=c(5,4,3,2), CASE=c("A","B","C","D"), RESULT=c("Result5","Result4","Result3","Result2"))
我试图删除连接中的引号,但它不起作用:
df_result <- merge ( x = df1, y = df2, by.x = ID , by.y = ID - 1 , all.x = TRUE)
有人可以帮助我吗?:)
谢谢 !
解决方案
tidyverse
重现您的预期输出的解决方案是
library(tidyverse)
left_join(df1, df2 %>% mutate(ID = ID - 1)) %>%
mutate(RESULT = str_replace(RESULT, "^(.+)[A-Z]$", paste0("\\1", ID)))
#Joining, by = "ID"
# ID CASE RESULT
#1 5 A Result5
#2 4 B Result4
#3 3 C Result3
#4 2 D Result2
说明:如果你只想合并ID
一个ID - 1
简单的
left_join(df1, df2 %>% mutate(ID = ID - 1))
# ID CASE RESULT
#1 5 A ResultA
#2 4 B ResultB
#3 3 C ResultC
#4 2 D ResultD
足够了。附加mutate
项负责RESULT
根据您的预期输出进行重命名。
或者一个基本的 R 选项将从
merge(df1, transform(df2, ID = ID - 1), by = "ID")
# ID CASE RESULT
#1 2 D ResultD
#2 3 C ResultC
#3 4 B ResultB
#4 5 A ResultA
包括重命名RESULT
transform(
merge(df1, transform(df2, ID = ID - 1), by = "ID"),
RESULT = paste0(substr(RESULT, 1, nchar(as.character(RESULT)) - 1), ID))
# ID CASE RESULT
#1 2 D Result2
#2 3 C Result3
#3 4 B Result4
#4 5 A Result5
重现您的预期输出(行顺序略有不同)。
推荐阅读
- google-sheets - 需要在多列中找到两个值的可能组合
- ansible - 仅从特定存储库升级包
- amazon-web-services - 为什么我们需要 distcp 命令将数据从 hdfs 复制到 s3,而我们可以直接将数据写入 s3 位置?
- c++ - SFML 无法打开文件
- python-3.x - 使用 spaCY 可视化文本中的关键字
- sql - PostgreSQL GROUP BY 列必须出现在 GROUP BY
- c++ - c++ 应用程序堆栈跟踪中的字节是什么意思
- authentication - Blazor @attribute [Authorize] 标签不起作用
- linux - Linux Shell 脚本 (bash) 使用 SSH 更改远程机器的 IP 地址
- maven - 在生成的jar中排除log4j.properties