मैं दो डेटाफ्रेम में शामिल होने की कोशिश कर रहा हूं। जुड़ने की शर्त 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)

क्या कोई मेरी मदद कर सकता है? : )

शुक्रिया !

r
0
Karibuu 3 जुलाई 2019, 15:47

1 उत्तर

सबसे बढ़िया उत्तर

आपके अपेक्षित आउटपुट को पुन: पेश करने के लिए एक 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

अपने अपेक्षित आउटपुट को पुन: प्रस्तुत करना (थोड़ा अलग पंक्ति क्रम के साथ)।

0
Maurits Evers 3 जुलाई 2019, 16:12