簡體   English   中英

匹配四列 R 之間的值組合

[英]Matching combinations of values between four columns R

我有兩個不同長度的 df,每個都有兩列,看起來像這樣:

t<-c(1,3,4,2,6)
f<-c(3,4,5,6,8)
df1<- cbind(t,f)


t<-c(6,4,5,1,2,3,5,7,8,9)
f<-c(4,5,6,3,8,5,6,3,2,1)
df2<- cbind(t,f)

我的問題是如何向 df1 添加一個新列,它為 df1 和 df2 中的兩個列之間的匹配值(在值的任一組合中,所以為 5-3 和 3-5)給出 1,如果值為 0不匹配。

我已經嘗試過 case_when (這是不正確的),但可能會解釋我在這里要問的問題(盡管我知道這需要同時使用 $t 和 $f 的組合來運行)

df1$b <- case_when(df1$t & df1$f == df2$t & df2$f ~ '1') %>%
replace_na(0)

我希望這是有道理的。

傑米

您可以使用基礎 R:

df1 <- data.frame(
  t=c(1,3,4,2,6),
  f=c(3,4,5,6,8))

df2 <- data.frame( 
  t=c(6,4,5,1,2,3,5,7,8,9),
  f=c(4,5,6,3,8,5,6,3,2,1))

df1$tf <- with(df1, paste0(t, '#', f))
df1$ft <- with(df1, paste0(f, '#', t))

df1$b <- with(df1, tf %in% paste0(df2$t, '#', df2$f) | ft %in% paste0(df2$t, '#', df2$f))
# > df1
#   t f  tf  ft  test
# 1 1 3 1#3 3#1  TRUE
# 2 3 4 3#4 4#3 FALSE
# 3 4 5 4#5 5#4  TRUE
# 4 2 6 2#6 6#2 FALSE
# 5 6 8 6#8 8#6 FALSE

或簡稱:

df1$b <- with(df1, paste0(t, '#', f) %in% paste0(df2$t, '#', df2$f) | 
                paste0(f, '#', t) %in% paste0(df2$t, '#', df2$f))

或者

df2tf <- with(df2, paste0(t, '#', f)
df1$b <- with(df1, paste0(t, '#', f) %in% df2tf | paste0(f, '#', t) %in% df2tf)

這是我能想到的最簡單的解決方案:

df1$b <- paste(df1$t,df1$f) %in% paste(df2$t,df2$f) | 
         paste(df1$f,df1$t) %in% paste(df2$t,df2$f)

| 符號表示邏輯“或”, %in%檢查第一個元素的每個元素是否在第二個元素的集合中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM