r - 确定适用于百分比文本到小数转换的列
问题描述
我导入的数据带有不同的行/列大小。我需要将文本 % (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
解决方案
tidyverse
解决方案如下:
df %>%
mutate_if(~sum(str_detect(., "%")) > 0,
~as.numeric(str_remove(., "%")) / 100)
推荐阅读
- python - 具有不必要特征的图像中的细胞计数
- c++ - 将对 main() 中的局部变量的引用传递给其他线程/函数是不好的做法吗?
- api - 如何从 API 检索沃尔玛产品
- api - 无法使用邮递员创建史诗
- python - 如果我已经打乱了一个数组`a`来获得一个数组`b`,我怎样才能获得一个索引数组'`i`使得`b [i] == a`?
- python-3.x - 我们如何从多字典创建 pyspark 数据框
- wordpress - WooCommerce/Elementor 分页更改整个页面
- javascript - 如何将项目添加到承诺之外的数组
- java - 在 AWS Lambda 中创建数据库服务
- python - 用matplotlib填充曲线下的区域