[英]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.