簡體   English   中英

R中mutate中的多個ifelse函數

[英]Multiple ifelse function inside a mutate in R

我正在嘗試創建一個new column ,它查看數據幀 A 中的第column 1是否與數據幀 B 中的第column 1匹配,以及是否存在匹配以具有數據幀 B 中列output中的值。如果數據幀 A 中的第column 1不一個找到一個匹配column 1在數據幀B.看是否存在之間匹配column 2在數據幀A和column 2數據幀B,並且如果存在匹配到具有output 2從數據幀B.如果有沒有匹配則為零。

這是我的嘗試,我認為它半有效,但它給了我很多 NA,很多這些 NA 是錯誤的,因為數據幀之間的列匹配,但它仍然作為 NA 出現。 任何幫助,將不勝感激。

 dataframeA<-dataframeA %>% mutate(newcolumn=ifelse(column1 %in% dataframeB$column1, dataframeB$output, ifelse(column2 %in% dataframeB$column2, dataframeB$output2,NA)))

我嘗試使用case_when但這不起作用,因為我希望輸出值來自一列。

編輯這里是來自@bloxx 幫助的一些示例數據

dataframeA<- data.frame(Column1 = c("a", "b", "c", "f"),
                    Column2 = c("a", "a", "a", "f"))
dataframeB<- data.frame(Column1 = c("b", "b", "c", "e", "f", "g", "h"),
                    Column2 = c("a", "b", "a", "e"),
                    Output = c("B", "B", "B", "B","B","B","B"),
                    Output2 = c("D", "D", "D", "D"))
dataframeA <- dataframeA %>% 
mutate(new_variable = ifelse(Column1 %in% dataframeB$Column1, 
dataframeB$Output,
ifelse(Column2 %in% 
dataframeB$Column2,dataframeB$Output2, 0 )))

在我的數據集中,dataframeB 的長度不同,但即使長度相同,也有很多 NA。

謝謝

我使用了一個for循環來做到這一點。 但是使用purrr可能有一個更有效和更優雅的解決方案。 反正:

數據:

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

df2 <- data.frame(value1 = c(1,2,3,8,5),
                  value2 = c(2,9,8,4,7),
                  output1 = c(4,4,4,4,4),
                  output2 = c(8,9,6,4,2))

代碼:

for(i in 1:2){
  if(i ==1) {out <- df1}
  out <- left_join(out, df2 %>%
              select(str_subset(names(df2),paste0(i,"$"))),
              by = str_subset(str_subset(names(out),paste0(i,"$")), names(df2)))
}

out <- out %>% 
  mutate(across(everything(), ~ifelse(is.na(.),0,.)))

輸出:

  value1 value2 output1 output2
1      1      2       4       8
2      2      5       4       0
3      3      8       4       6
4      4      4       0       4
5      5      6       4       0

您可以將for循環參數中的索引更改for要合並數據幀的值的數量。

你也可以用 ifelse 來做。


dataframeA<- data.frame(Column1 = c("a", "b", "c", "f"),
                        Column2 = c("a", "a", "a", "f"))
dataframeB<- data.frame(Column1 = c("b", "b", "c", "e"),
                        Column2 = c("a", "b", "a", "e"),
                        Output = c("B", "B", "B", "B"),
                        Output2 = c("D", "D", "D", "D"))
dataframeA <- dataframeA %>% 
  mutate(new_variable = ifelse(Column1 %in% dataframeB$Column1, dataframeB$Output,
                               ifelse(Column2 %in% dataframeB$Column2,dataframeB$Output2, 0 )))

更新

dataframeA<- data.frame(Column1 = c("a", "b", "c", "f", "g"),
                        Column2 = c("a", "a", "a", "f", "g"))
dataframeB<- data.frame(Column1 = c("b", "b", "c", "e", "g"),
                        Column2 = c("a", "b", "a", "e", "g"),
                        Output = c("B", "B", "B", "B", "B"),
                        Output2 = c("D", "D", "D", "D", "D"))

dataframeA <- dataframeA %>% 
  mutate(new_variable = ifelse(Column1 %in% dataframeB$Column1 & Column2 %in% dataframeB$Column2, dataframeB$Output,
                               ifelse(Column2 %in% dataframeB$Column2,dataframeB$Output2, 
                                      ifelse(Column1 %in% dataframeB$Column1, dataframeB$Output, NA))))

暫無
暫無

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

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