2017-09-04 74 views
0

假設2個dataframes:A和含B的數據,如以下之一: 數據幀:一個數據幀:乙ifelse函數接受if語句的輸出作爲返回向量

ColA1 ColA2    ColB1  ColB2 
    | Dog | Lion    | Lion  | Lion 
    | Lion | Dog    | Cat  | NA 
    | Zebra | Tiger    | Tiger | Tiger 
    | Bat | Parrot   | Dog  | Dog 

如果動物ColB1存在於ColA1或ColA2中,然後從ColB2中將該動物的名稱插入ColB2,否則插入NA。

,而不是運行ifelse函數兩次兩次:

B$ColB2<- ifelse((B$ColB1 %in% A$ColA1 | B$ColB1 %in% AColA2), "animal from ColA1" , NA) 

這怎麼可能變短?通過應用功能,它可以變得更快嗎?

+4

[如何做出了巨大的ř重現的實例?](http://stackoverflow.com/questions/5963269) – Sotos

+3

也許'B $ ColB2 < - ifelse( B $ ColB1%以%唯一(c(A $ ColA1,A $ ColA2)),B $ ColB1,NA)' – zx8754

+0

索引的使用也是選項。查看我的答案 – h3rm4n

回答

1

這可能是最簡單的:

df_B$ColB2 <- ifelse(df_B$ColB1 %in% unlist(df_A[,c(1:2)]), df_B$ColB1, NA) 

輸出:

ColB1 ColB2 
1 Lion Lion 
2 Cat <NA> 
3 Tiger Tiger 
4 Dog Dog 

要查找DF_A的每一列中的值相匹配的單獨指標df_B $ ColB1,你可以使用類似的東西:

x<-apply(df_A[,c(1:2)],2,function(x) sapply(df_B$ColB1, function(i) grep(i,x))) 
STR(X)的

輸出:

List of 2 
$ ColA1:List of 4 
..$ Lion : int 2 
..$ Cat : int(0) 
..$ Tiger: int(0) 
..$ Dog : int 1 
$ ColA2:List of 4 
..$ Lion : int 1 
..$ Cat : int(0) 
..$ Tiger: int 3 
..$ Dog : int 2 
+0

謝謝,這對我來說看起來更加緊湊。如果我想在真實情況下給出A列的值,而不是給出值df_B $ ColB1,我怎麼能得到它?更精確地保留你的代碼,我們可以得到匹配發生的A列的索引而不是「df_B $ ColB1」嗎? –

+0

@DinoC - 沒問題,我可以幫你。你想要什麼樣的結果?您是否希望df_A的每個列中的單個索引與df_B $ ColB1中的值匹配?我剛剛在上面提供了一個輸出的例子,我可以修改輸出,如果這不是你想要的。 – www

+0

再次感謝。我編輯了我的第一篇文章。任何ideda在這? –

1

你可以嘗試dplyr

library(dplyr) 

dfB %>% 
    mutate(colB3 = if_else(ColB1 %in% unlist(dfA), ColB1, NULL)) 

這給:

ColB1 ColB2 colB3 
1 Lion Lion Lion 
2 Cat  NA  NA 
3 Tiger Tiger Tiger 
4 Dog Dog Dog 

輸入:

dput(dfA) 
structure(list(ColA1 = structure(c(2L, 3L, 4L, 1L), .Label = c("Bat", 
"Dog", "Lion", "Zebra"), class = "factor"), ColA2 = structure(c(2L, 
1L, 4L, 3L), .Label = c("Dog", "Lion", "Parrot", "Tiger"), class = "factor")), class = "data.frame", row.names = c(NA, 
-4L), .Names = c("ColA1", "ColA2")) 

dput(dfB) 
structure(list(ColB1 = structure(c(3L, 1L, 4L, 2L), .Label = c("Cat", 
"Dog", "Lion", "Tiger"), class = "factor"), ColB2 = structure(c(2L, 
3L, 4L, 1L), .Label = c("Dog", "Lion", "NA", "Tiger"), class = "factor")), class = "data.frame", row.names = c(NA, 
-4L), .Names = c("ColB1", "ColB2")) 
+2

另外你需要提一下你使用的任何庫(我不知道你爲什麼要在這裏加載一個包來執行'ifelse'),但是你仍然需要提及它們 – Sotos

2

使用索引也選擇:

i <- dfB$ColB1 %in% unlist(dfA) 
dfB$ColB2[i] <- as.character(dfB$ColB2[i]) 

結果:

> dfB 
    ColB1 ColB2 
1 Lion Lion 
2 Cat NA 
3 Tiger Tiger 
4 Dog Dog