首页 > 解决方案 > 确定适用于百分比文本到小数转换的列

问题描述

我导入的数据带有不同的行/列大小。我需要将文本 % (32%) 转换为十进制 (0.32)。有些列具有文本百分比,其他列是普通数字,需要保持不变。

我可以跨列将字符串转换为十进制,并在整个数据框中应用它,但是没有一种优雅的方法可以选择性地仅将转换应用于相关列。我通过创建一个向量来检测具有 % 字符串的列,然后在数据帧中运行一个循环来检查要应用此规则的列的向量,从而以笨拙的方式解决了我的问题。我正在寻找更清洁的解决方案

# Example structure of data on a small scale
df <- data.frame(desc = c('a','b','c'),val = c(10, 3, 100), perc = c('23.01%', '11.0%','2.33%'))
#   desc val   perc
# 1    a  10 23.01%
# 2    b   3  11.0%
# 3    c 100  2.33%

# the below converts everything which is not desired
sapply(df, function(x) as.numeric(sub("%","",x))/100)
#      desc  val   perc
# [1,]   NA 0.10 0.2301
# [2,]   NA 0.03 0.1100
# [3,]   NA 1.00 0.0233

# my (clunky) solution
aa <- rep(0,ncol(df))
for(i in 1:ncol(df)){aa[i] <- length(grep("%",df[,i]))}
# [1] 0 0 3
for(i in 1:ncol(df)){if (aa[i]>0) {df[,i] <- as.numeric(sub("%", "",df[,i],fixed=TRUE))/100 } }
#  desc val   perc
# 1    a  10 0.2301
# 2    b   3 0.1100
# 3    c 100 0.0233

标签: rimport

解决方案


tidyverse解决方案如下:

df %>% 
  mutate_if(~sum(str_detect(., "%")) > 0, 
            ~as.numeric(str_remove(., "%")) / 100)

推荐阅读