2017-09-27 88 views
0

我试图在12小时后将包含单词“length”的变量的所有值更改为NA。mutate_if错误:无法将列表转换为函数

df_data <- cbind(
    seq(0, 15, by = 0.5), 
    sample(seq(from = 100, to = 300, by = 10), size = 31, replace = TRUE), 
    sample(seq(from = 1, to = 100, by = 9), size = 31, replace = TRUE), 
    sample(seq(from = 50, to = 60, by = 2), size = 31, replace = TRUE), 
    sample(seq(from = 100, to = 130, by = 1), size = 31, replace = TRUE) 
) %>% as.data.frame() 

colnames(df_data) <- c("hour", "a", "a_lenght", "b", "b_length") 


df_new <- df_data %>% 
    mutate_if(vars(contains("length")), funs(ifelse(df_data$hour > 12, NA, .))) 

但我得到一个Can't convert a list to function错误

+3

使用'mutate_at'而不是'mutate_if'。你提供了一个'.vars'参数(选择的列表),但是'mutate_if'需要一个'.predicate'函数(求值为TRUE/FALSE) – wici

+0

谢谢,我也可以用'grepl'修改它''mutate_if (grepl(pattern ='length',x = names(df_data)),funs(ifelse(df_data $ hour> 12,NA,。)))' –

回答

2

总结已经取得的评论:

mutate_at使用的列名 - 这是最有用的,当你可以提供一个选择列的标准列名称的特征。 这通常采取以下形式: mutate_at(VARS(ENDS_WITH( “长度”)),玩意儿(...))

mutate_if使用柱含量 - 是最有用的时候可以提供一个谓词功能选择列基于列本身的内容。这通常采取以下形式: mutate_if(is.integer,玩意儿(...))

但作为加林娜指出,mutate_if是通用的,并且可以“骗”列名操作使用grepl

+0

有没有两种方法可以做到?我想改变一个特定的列,但仅限于某个类。 – jzadra

+0

当然,如果您知道列的名称,则可以使用以下形式的简单mutate:mutate(column_name = function)。或者,您可以使用mutate_at,并调用用户定义的函数来检查类并执行转换。 – GGAnderson

相关问题