[英]R ifelse based on an observation meeting two criteria
是的,這確實是一個非常簡單的問題,因為我知道這是一種合乎邏輯的方法,這只會使我陷入困境。 我有兩個數據幀,並希望在第一個數據幀0/1中創建新列,具體取決於第二個數據幀中的任何行是否包含第一個中的col1 / col2對。
數據
df.ex1 <- data.frame('name'=c('sally', 'joe', 'ben', 'nick'), 'grade1'=c('A', 'B', 'F', 'A'))
df.ex2 <- data.frame('name'=c('jed', 'ben', 'sally', 'nick'), 'grade1'=c('A', 'F', 'A', 'C'))
> df.ex1
name grade1
1 sally A
2 joe B
3 ben F
4 nick A
> df.ex2
name grade1
1 jed A
2 ben F
3 sally A
4 nick C
#Expected result:
name grade1 bin
1 sally A 1
2 joe B 0
3 ben F 1
4 nick A 0
顯而易見的方法是檢查第二個df中是否存在名稱/等級對:
df.ex1$bin <- ifelse(df.ex1[,1:2] %in% df.ex2[,1:2], 1, 0)
但這是行不通的。 為什么不? 正確的方法是什么? 實際上,什么是得出正確方法的正確思維過程?
請注意,這顯然行不通:
df.ex1$bin <- ifelse(df.ex1[,1] %in% df.ex2[,1] & df.ex1[,2] %in% df.ex2[,2], 1, 0)
您可能正在首先基於聯接尋找一些東西:
df.ex2$bin <- 1
res <- merge(df.ex1,df.ex2,all.x = TRUE)
res$bin <- ifelse(is.na(res$bin),0,1)
> res
name grade1 bin
1 ben F 1
2 joe B 0
3 nick A 0
4 sally A 1
使用其他流行的軟件包,例如dplyr或data.table,會有許多等效的方法來執行此操作。
您可以使用data.table“更新聯接”
library(data.table)
setDT(df.ex1)
setDT(df.ex2)
df.ex1[, bin := 0]
df.ex1[df.ex2, on = .(name, grade1), bin := 1]
df.ex1
# name grade1 bin
# 1: sally A 1
# 2: joe B 0
# 3: ben F 1
# 4: nick A 0
您可以將兩列與interaction
結合在一起,然后像完成操作一樣使用%in%
:
df.ex1$bin <- ifelse(interaction(df.ex1[,1:2]) %in% interaction(df.ex2[,1:2]), 1, 0)
df.ex1
# name grade1 bin
#1 sally A 1
#2 joe B 0
#3 ben F 1
#4 nick A 0
在這種情況下, interaction
將通過df.ex1[,1:2]
選擇的兩列因子連接在一起,並構成一個向量。
df.ex1[,1:2] #gives you a data.frame
# name grade1
#1 sally A
#2 joe B
#3 ben F
#4 nick A
interaction(df.ex1[,1:2]) #gives you a factor
#sally.A joe.B ben.F nick.A
然后將這兩個因子/向量應用於%in%
。
或者,您可以使用以下paste
:
ifelse(do.call(paste, df.ex1[,1:2]) %in% do.call(paste, df.ex2[,1:2]), 1, 0)
在此paste
與interaction
具有相同的效果。 它將兩列連接在一起並構成一個向量。
do.call(paste, df.ex1[,1:2])
#"sally A" "joe B" "ben F" "nick A"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.