Как преобразовать процентный текст в числовой, используя трубу dplyr? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть следующий тиббл:

library(tidyverse)
dat <- structure(list(V1 = c("Number of input reads", "Uniquely mapped reads number", 
"Uniquely mapped reads %", "Average mapped length"), V2 = c("26265603", 
"13330431", "50.75%", "47.37")), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -4L))

Это выглядит так:

  V1                           V2      
  <chr>                        <chr>   
1 Number of input reads        26265603
2 Uniquely mapped reads number 13330431
3 Uniquely mapped reads %      50.75%  
4 Average mapped length        47.37 

Я хочу преобразовать столбец V2 в числовой. Ожидаемый конечный результат таков:

  V1                           V2      
  <chr>                        <dbl>   
1 Number of input reads        26265603
2 Uniquely mapped reads number 13330431
3 Uniquely mapped reads %      0.5075 
4 Average mapped length        47.37 

Я пробовал это

dat %>%
mutate(V2 = case_when(V1 == "Uniquely mapped reads %" ~ as.numeric(sub("%","",V2))/100, 
                        TRUE ~ as.numeric(V2)))

, но он предупреждает меня:

Warning message:
In eval_tidy(pair$rhs, env = default_env) : NAs introduced by coercion

Какой правильный способ сделать это

1 Ответ

1 голос
/ 06 ноября 2019

Это может быть немного запутанно с использованием каналов, поскольку мы хотим обновить только несколько строк, но в базе R мы можем сначала найти строки, в которых есть конкретная строка, и обновить только эти V2 значения.

inds <- dat$V1 ==  "Uniquely mapped reads %"
dat$V2[inds] <- as.numeric(sub("%", "", dat$V2[inds]))/100

dat
# A tibble: 4 x 2
#  V1                           V2      
#  <chr>                        <chr>   
#1 Number of input reads        26265603
#2 Uniquely mapped reads number 13330431
#3 Uniquely mapped reads %      0.5075  
#4 Average mapped length        47.37 

Способ с использованием труб может быть

library(dplyr)

dat %>%
   mutate(V2 = as.numeric(sub("%", "", V2))/
               (c(1, 100)[(V1 == "Uniquely mapped reads %") + 1]))
...