首页 文章

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

提问于
浏览
1

使用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 回答

  • 2

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

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

    或者我们可以使用申请

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

    基本R等价物是这样的 .

    df$c[apply(df == 7, 1, any)] <- 100
    
  • 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)))
    

相关问题