首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mutate_at与mutate_if的结合

mutate_at与mutate_if的结合
EN

Stack Overflow用户
提问于 2020-03-11 15:01:35
回答 2查看 488关注 0票数 4

我正在我的包中创建一个通用函数。目标是查找列百分比,如果它们是parse_number列,则在它们上使用character。我还没有找到使用mutate_atifelse的解决方案。我在下面贴了一张复述纸。

代码语言:javascript
复制
 library(tidyverse)


df <- tibble::tribble(
  ~name, ~pass_percent, ~attendance_percent, ~grade,
  "Jon",         "90%",                0.85,    "B",
  "Jim",        "100%",                   1,    "A"
  )

percent_names <- df %>% select(ends_with("percent"))%>% names()


# Error due to attendance_percent already being in numeric value

if (percent_names %>% length() > 0) {
    df <-
      df %>%
      dplyr::mutate_at(percent_names, readr::parse_number)
  }
#> Error in parse_vector(x, col_number(), na = na, locale = locale, trim_ws = trim_ws): is.character(x) is not TRUE
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-11 15:38:33

您的attendance_percent变量是数字变量,而不是字符,而parse_number只需要字符变量,请参见这里。因此,解决办法是:

代码语言:javascript
复制
edited_parse_number <- function(x, ...) {
  if (mode(x) == 'numeric') {
    x
  } else {
    parse_number(x, ...)
  }
}


df %>%
  dplyr::mutate_at(vars(percent_names), edited_parse_number)

#  name  pass_percent attendance_percent grade
#  <chr>        <dbl>              <dbl> <chr>
#1 Jon             90               0.85 B    
#2 Jim            100               1    A   

如果不想使用该额外函数,请在开始时提取字符变量:

代码语言:javascript
复制
percent_names <- df %>% 
  select(ends_with("percent")) %>% 
  select_if(is.character) %>% 
  names()
percent_names
# [1] "pass_percent"


df %>%
  dplyr::mutate_at(vars(percent_names), parse_number)
#   name  pass_percent attendance_percent grade
#   <chr>        <dbl>              <dbl> <chr>
# 1 Jon             90               0.85 B    
# 2 Jim            100               1    A    
票数 4
EN

Stack Overflow用户

发布于 2020-03-11 15:45:21

或者,无需创建函数,只需将ifelse语句添加到mutate_at中,如:

代码语言:javascript
复制
if (percent_names %>% length() > 0) {
  df <-
    df %>% rowwise() %>%
    dplyr::mutate_at(vars(percent_names), ~ifelse(is.character(.), 
                                                  parse_number(.),
                                                  .))
}

Source: local data frame [2 x 4]
Groups: <by row>

# A tibble: 2 x 4
  name  pass_percent attendance_percent grade
  <chr>        <dbl>              <dbl> <chr>
1 Jon             90               0.85 B    
2 Jim            100               1    A    
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60638968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档