【问题标题】:How to make mass correction and conversion characters of vector to the numeric如何将向量的质量校正和转换字符转换为数值
【发布时间】:2020-01-24 19:28:23
【问题描述】:

我有一个很大的字符向量,包含我需要更正的数字,然后转换为数字向量,例如:

data.f <- c('11.23', '34,32 + 12,17', '21.1')

我需要得到这样的结果:

num 11.23 34.32 21.1

我尝试使用apply函数族来解决这个问题

num <- sapply(data.f, function(x) ifelse(nchar(data.f[x])<6, data.f[x] <- as.numeric(data.f[x]), data.f[x] <- as.numeric(substring(gsub("[,]", ".", data.f[x]), 1,5))))

我尝试过不同的选择

num <- sapply(data.f, function(x) ifelse(nchar(data.f[x])<6, as.numeric(data.f[x]), as.numeric(substring(gsub("[,]", ".", data.f[x]), 1,5))))

gsub - 改变来点

substring - 剪掉多余的符号(最好找到平均值)

as.numeric - 将字符转换为数字

但结果和我一样:

str(num)
- attr(*, "names")= chr [1:3] "11.23" "34,32 + 12,17" "21.1"
attributes(num) 
$names
[1] "11.23"         "34,32 + 12,17" "21.1" 

我需要帮助来解决问题,也许一些好人会看到我搞砸了什么?

【问题讨论】:

    标签: r character apply


    【解决方案1】:

    我们可以将,替换为.,并使用parse_number提取号码

    readr::parse_number(gsub(",", ".", data.f))
    #[1] 11.23 34.32 21.10
    

    ifelseif/else 不同(一次采用一个元素),它是矢量化的。所以,我们真的不需要循环函数(sapply 是循环 vector 的每个元素 - 对于向量,单位是单个元素)

    ifelse(nchar(data.f) < 6, as.numeric(data.f), 
           as.numeric(substr(gsub(',', '.', data.f), 1, 5)))
    #[1] 11.23 34.32 21.10
    

    注意:ncharsubstrifelseas.numericgsub 都可以采用长度 > 1 的 vector

    【讨论】:

    • 看起来很好用。谢谢!但是,您能否展示通过使用 apply 系列将函数应用于变量中的每个值的示例?我的代码有什么问题?
    • @NikitaSnegirev ifelse 是矢量化的。所以你不需要在这里循环。 sapply 循环遍历每个元素(这里的单位是向量的单个元素),然后应用 ifelse。相反,ifelse 可以直接应用于整个数据集,这与if/else不同
    • @NikitaSnegirev 你可以做ifelse(nchar(data.f) &lt; 6, as.numeric(data.f), as.numeric(substr(gsub(',', '.', data.f), 1, 5)))当你将字符转换为numeric时会有友好的警告,因为它会对完整数据进行转换
    猜你喜欢
    • 2021-10-31
    • 2017-11-06
    • 2023-04-01
    • 2021-03-19
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多