df <- data.frame(A = c('100, 200, 300, 100', '100, 200', '100, 200, 300'), B = c('100, 200, 300', '100, 200, 300', '100, 200'), stringsAsFactors = FALSE) Saya punya contoh bingkai data di sini Contoh kerangka data r matching

0
P Initiate 1 Oktober 2021, 09:04

2 jawaban

Jawaban Terbaik

Anda dapat membagi kolom A dan kolom B dengan koma dan membandingkannya untuk mendapatkan output.

library(dplyr)
library(purrr)

df %>%
  mutate(across(A:B, strsplit, ',\\s*'), 
         Flag = map2_chr(A, B, ~if(all(.x %in% .y) && all(.y %in% .x)) 'Y' else 'N'),
         ColumnA = map2_chr(A, B, ~toString(setdiff(.y, .x))), 
         ColumnB = map2_chr(A, B, ~toString(setdiff(.x, .y))))

#              A             B Flag ColumnA ColumnB
#1 100, 200, 300 100, 200, 300    Y                
#2      100, 200 100, 200, 300    N     300        
#3 100, 200, 300      100, 200    N             300

Untuk contoh ini, untuk mendapatkan kolom Flag kita bisa melakukan Flag = ifelse(A == B, 'Y', 'N') tetapi bagaimana jika Anda memiliki nilai seperti 100, 200, 300 dan 300, 200, 100 dalam hal ini ifelse akan mengembalikan 'N' dan karenanya saya lebih suka membagi dan membandingkan.

data

Lebih mudah untuk membantu jika Anda memberikan data dalam format yang dapat direproduksi

df <- data.frame(A = c('100, 200, 300', '100, 200', '100, 200, 300'), 
                 B = c('100, 200, 300', '100, 200, 300', '100, 200'))
0
Ronak Shah 1 Oktober 2021, 06:30

Ini cukup berantakan tetapi akan mendapatkan apa yang Anda inginkan.

library(dplyr)
  df1 <- data.frame(
    A = c("100,200,300", "100,200", "100,200,400"),
    B = c("100,200,300", "100,200,300", "100,200")
  )
  isEmpty <- function(x) {
    return(length(x)==0)
  }
df1 <- df1 %>%
  mutate(A = as.character(A),
         B = as.character(B)) %>%
  mutate(Flag = ifelse(A == B, "Y", "N"))

df2 <- apply(df1, 1, function(x){
  if (x[3] == "N"){
    a <- x[1] %>% strsplit(., ",") %>% unlist %>% as.numeric()
    b <- x[2] %>% strsplit(., ",") %>% unlist %>% as.numeric()
    val_A <- ifelse(isEmpty(setdiff(a,b)), "A", setdiff(a,b))
    val_B <- ifelse(isEmpty(setdiff(b,a)), "A", setdiff(b,a))
    c(val_A,val_B)
  } else {
    c(NA,NA)
  }
}) %>% t %>% as.data.frame() %>% dplyr::rename(Value_A = V1, Value_B = V2)
cbind(df1, df2)

            A           B Flag Value_A Value_B
1 100,200,300 100,200,300    Y    <NA>    <NA>
2     100,200 100,200,300    N       A     300
3 100,200,400     100,200    N     400       A
0
Park 1 Oktober 2021, 06:47