使用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可能无法做到这一点?
答案 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)))