有没有更好的方法在R中优化这段代码
df = data.frame("Population" = c("4.88M", "3.12M", "819k", "4660", "46.7k", "4.86M", "856k"))
int_list <- numeric(nrow(df))
for (y in 1:nrow(df)) {
i <- df$Population[y]
if (str_detect(i, "k")){
no_k <- gsub("k", "", i)
x <- as.numeric(no_k)
fix_X <- x * 1000
} else if (str_detect(i, "M")) {
no_M <- gsub("M", "", i)
x <- as.numeric(no_M)
fix_X <- x * 1000000
} else {
fix_X <- as.numeric(i)
}
int_list[y] = fix_X
}
df$pop_fix <- int_list
编辑:添加DF示例
我得到了我需要的结果,只是想知道我是否可以做得更好,我试过ifelse语句,但它们总是导致错误,我也试过把它放在列中,但它会把过去的值覆盖到最后一个
4条答案
按热度按时间bz4sfanl1#
这里有一个简化的尝试。去掉除了
k/M
后缀之外的所有内容,然后去掉k/M
,并使用后缀的一些索引来确定乘数:给出请求的结果:
umuewwlo2#
我们可以使用tidyverse首先
separate
取幂器的数值。然后将符号指数转换为一个合适的以10为底的数字,最后通过简单的乘法来调整种群。ua4mk5z43#
2nbm6dog4#
**1)**这里有一个一行代码。未使用任何包。
**2)**或使用
Reduce
**3)**这也可以工作,并且在概念上同时进行两个替换: