R语言 如果某些值有%符号,而某些值没有,则将列转换为数值

ubof19bj  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(167)

我有一个 Dataframe df,其中包含多个名为x_1、x_2、x_3等的列,这些列是类字符,但我想将它们转换为数字。问题是,有些值是小数,而其他值是百分比,包含一个%符号。请参阅我在此处的输入:

df <- data.frame(Company  = c("abc", "def", "ghi"),
                  x_1 = c(0.05, "0.6%", "11.25%"),
                  x_y_1 = c("val_1", "val_2", "val_3"),
                  x_2 = c("3.5%", 0.12, 0.7),
                  x_y_2 = c("val_1", "val_2", "val_3"),
                  x_3 = c(0.83, 0.4, "0.9%"),
                  x_y_3 = c("val_1", "val_2", "val_3")
                  )
> df
  Company    x_1 x_y_1  x_2 x_y_2  x_3 x_y_3
1     abc   0.05 val_1 3.5% val_1 0.83 val_1
2     def   0.6% val_2 0.12 val_2  0.4 val_2
3     ghi 11.25% val_3  0.7 val_3 0.9% val_3

我想把列x_1、x_2、x_3转换成numeric,所以输出应该如下所示:

> df
  Company    x_1   x_y_1  x_2   x_y_2  x_3   x_y_3
1     abc   0.05   val_1  0.035 val_1  0.83  val_1
2     def   0.006  val_2  0.12  val_2  0.4   val_2
3     ghi   0.1125 val_3  0.7   val_3  0.009 val_3

我如何只将包含%符号的值转换为正确的数值?谢谢。

t1rydlwq

t1rydlwq1#

这些示例中的前提是一个两步过程:
1.根据%的存在确定分母;
1.通过删除%(无论其是否存在)并转换为numeric来推导分子。

碱基R

df[c(2,4,6)] <- lapply(df[c(2,4,6)],
                       function(z) as.numeric(sub("%", "", z)) / ifelse(grepl("%", z), 100, 1))
df
#   Company    x_1 x_y_1   x_2 x_y_2   x_3 x_y_3
# 1     abc 0.0500 val_1 0.035 val_1 0.830 val_1
# 2     def 0.0060 val_2 0.120 val_2 0.400 val_2
# 3     ghi 0.1125 val_3 0.700 val_3 0.009 val_3

library(dplyr)
df %>%
  mutate(across(c(2, 4, 6),
         ~ as.numeric(sub("%", "", .)) / if_else(grepl("%", .), 100, 1)))
#   Company    x_1 x_y_1   x_2 x_y_2   x_3 x_y_3
# 1     abc 0.0500 val_1 0.035 val_1 0.830 val_1
# 2     def 0.0060 val_2 0.120 val_2 0.400 val_2
# 3     ghi 0.1125 val_3 0.700 val_3 0.009 val_3

相关问题