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