【问题标题】:Multiple ifelse function inside a mutate in RR中变异内的多个ifelse函数
【发布时间】:2021-09-28 15:18:33
【问题描述】:

我正在尝试创建一个new column,它查看数据帧 A 中的 column 1 是否与数据帧 B 中的 column 1 匹配,以及数据帧中的 output 列中的值是否匹配B.如果数据帧A中的column 1在数据帧B中的column 1中没有找到匹配项。查看数据帧A中的column 2和数据帧B中的column 2是否匹配,以及是否匹配从数据帧 B 中获得output 2。如果没有匹配项,则为零。

这是我的尝试,我认为它是半有效的,但它给了我很多 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。

谢谢

【问题讨论】:

  • 请分享reproducible example,包括您使用的数据的一个小例子。
  • 如果您提供示例数据和所需的输出,这个问题(很可能)会得到改善并获得更好的答案。
  • 对我来说,您的问题听起来更像是一个连接而不是 ifelse 问题。看看 dplyr 的 left_joincoalesce 函数。

标签: r if-statement dplyr conditional-statements


【解决方案1】:

你也可以用 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))))

【讨论】:

  • 谢谢,这是最接近我所要求的。但是,它不起作用,似乎如果第 1 列和第 2 列都匹配并且它返回 NA。我将在我的问题中使用你的例子:)
  • 检查更新。第四行没有匹配所以 NA,第五行两者都有匹配并且是 output1。
【解决方案2】:

我使用了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 循环参数中的索引更改为要合并数据帧的值的数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2015-07-11
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多