【问题标题】:mutate_if Error: Can't convert a list to functionmutate_if 错误:无法将列表转换为函数
【发布时间】:2017-09-27 07:50:14
【问题描述】:

我正在尝试将 12 小时后包含单词“length”的变量的所有值更改为 NA。

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 错误

【问题讨论】:

  • 使用mutate_at 而不是mutate_if。您提供了一个 .vars 参数(选定列的列表),但 mutate_if 需要一个 .predicate 函数(评估为 TRUE/FALSE)
  • 谢谢,我也可以用grepl - mutate_if(grepl(pattern = 'length', x = names(df_data)),funs(ifelse(df_data$hour&gt;12,NA,.))) 修复它

标签: r dplyr


【解决方案1】:

总结已经制作的cmets:

mutate_at 使用列名 - 当您可以提供根据列名特征选择列的条件时,它最有用。 这通常采用以下形式: mutate_at(vars(ends_with("length")), funs(...))

mutate_if 使用列内容 - 当您可以提供一个根据列本身的内容选择列的谓词函数时最有用。这通常采用以下形式: mutate_if(is.integer, funs(...))

但正如 Galina 指出的那样,mutate_if 是通用的,可以“欺骗”使用 grepl 对列名进行操作

【讨论】:

  • 有没有办法做到这两点?我想改变一个特定的列,但前提是它是一个特定的类。
  • 当然,如果您知道列的名称,您可以使用简单的 mutate,其形式为:mutate(column_name = function)。或者,您可以使用 mutate_at,并调用一个用户定义的函数来检查类并执行转换。
猜你喜欢
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2023-01-30
  • 2019-03-17
  • 1970-01-01
相关资源
最近更新 更多