簡體   English   中英

Rifelse基於滿足兩個條件的觀察

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

使用其他流行的軟件包,例如dplyrdata.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)

在此pasteinteraction具有相同的效果。 它將兩列連接在一起並構成一個向量。

do.call(paste, df.ex1[,1:2])
#"sally A" "joe B"   "ben F"   "nick A"

暫無
暫無

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

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