R 将包含指数的字符数据(例如 E+11、E+20)替换为动态的 0 数



我有一个数据帧df_before其中一列包含如下值:

id
123456789
1.11E+2
3.52E+4
5.60E+5
0001112345857RAE

并希望将它们转换为df_after

id
123456789
111
35200
560000
0001112345857RAE

基本上我想去掉周期.,并根据指数的数量/幂用0's替换任何E+XX。这是我尝试过的:

 df_after$id <- ifelse(str_detect(df_before$id, "E\+\d+$"),
                                gsub("E\+\d+",
                                     strrep("0", as.numeric(gsub(".*E\+(\d+)$", "\1", df_before$id)) - 2),
                                     gsub("\.", "", df_before$id)),
                                df_before$id)

上述代码的每个较小块都使用 1 个单个输入,例如:

strrep("0", as.numeric(gsub(".*E\+(\d+)$", "\1", "6.32E+3")))

结果在:

"000" # which is as expected

也:

gsub("E\+\d+",
    strrep("0", as.numeric(gsub(".*E\+(\d+)$", "\1", "6.32E+3")) - 2), 
    gsub("\.", "", "6.32E+3"))

给:

"6320" # as expected and desired

但是当我使用 ifelse 和 str_detect 将其应用于整个列时(对于那些包含 E+XX 的条目也按预期工作,它运行非常慢并返回 NA 和一些值,例如 6320NA000NA000NA000NA000....<truncated>

有人可以帮我修复这个代码块,以便它与数据帧列一起使用吗?

非常感谢!

我们可以使用as.numeric来转换数值,而非数值则变为NA。使用 is.na ,然后我们索引并将那些只有数字的值分配给 'id' 列

df_after <- df_before
v1 <- as.numeric(df_before$id)
i1 <- !is.na(v1)
df_after$id[i1] <- v1[i1]
df_after
#              id
#1        123456789
#2              111
#3            35200
#4           560000
#5 0001112345857RAE

最新更新