如果行中的任何列满足条件而不是mutate()列

时间:2017-09-18 17:56:04

标签: r if-statement dplyr conditional

使用dplyr,我试图使用ifelse和mutate有条件地更新列中的值。我想说,在数据框中,如果一行中的任何变量(列)等于7,那么变量c应该变为100,否则c保持不变。

df <- data.frame(a = c(1,2,3),
                 b = c(1,7,3),
                 c = c(5,2,9))

df <- df %>%  mutate(c = ifelse(any(vars(everything()) == 7), 100, c))

这给了我错误:

Error in mutate_impl(.data, dots) : 
  Evaluation error: (list) object cannot be coerced to type 'double'.

我想要的输出是:

  a b   c
1 1 1   5
2 2 7 100
3 3 3   9

注意:这是包含更多行和列的更大数据集的抽象示例。

编辑: 这段代码让我更接近一点,但它并没有应用每一行的ifelse语句。相反,如果数据框中的任何位置存在7,则它会将列c中的所有值更改为100.

df <- df %>%  mutate(c = ifelse(any(select(., everything()) == 7), 100, c))

  a b   c
1 1 1 100
2 2 7 100
3 3 3 100

使用dplyr可能无法做到这一点?

2 个答案:

答案 0 :(得分:2)

我认为这应该有效。我们可以检查df中的值是否等于7.之后,使用rowSums查看是否有大于0的行,这意味着至少有一个值为7.

df <- df %>% mutate(c = ifelse(rowSums(df == 7) > 0, 100, c))

或者我们可以使用apply

df <- df %>% mutate(c = ifelse(apply(df == 7, 1, any), 100, c))

基础R等价物是这样的。

df$c[apply(df == 7, 1, any)] <- 100

答案 1 :(得分:1)

您可以尝试使用purrr::map_dbl

library(purrr)
df$c <- map_dbl(1:nrow(df), ~ifelse(any(df[.x,]==7), 100, df[.x,]$c))

输出

  a b   c
1 1 1   5
2 2 7 100
3 3 3   9

dplyr::mutate声明中,这将是

library(purrr)
library(dplyr)
df %>%
   mutate(c = map_dbl(1:nrow(df), ~ifelse(any(df[.x,]==7), 100, df[.x,]$c)))