我有一个数据帧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