【问题标题】:Create column, separated by "," as a numeric output创建以“,”分隔的列作为数字输出
【发布时间】:2019-08-19 10:24:35
【问题描述】:

我正在尝试将当前在行中的数据作为"XXX-XX-0001, YY-YY-0001" 呈现到一个新列中,概述每行中的数字 [2]

我已经设法改变了一个新列,但是它是一个字符输出chr [2],我需要这只是 2。

{r}
bill <- bill %>%
mutate(NO_IA = strsplit(as.character(IA_YES), ","))

当我尝试用作.numeric 时,它不喜欢我的输入是“,” - 如果我尝试将其加倍拒绝它(as.numericas.character 在同一行)

【问题讨论】:

    标签: r strsplit


    【解决方案1】:

    经过一番澄清,这是一个更好的答案:

    数据(来自评论)

    string <- scan(text = "
    AAA-GB-0001 
    BBB-ES-0005,ADD-GB-0001 
    BSC-ES-0005,HQQ-GB-0001,REE-GB-0001 
    BDD-GB-0001,BSC-ES-0005,HQQ-GB-0001,UZZ-DE-0001 
    BDD-GB-0001,UEE-DE-0001 
    BDD-GB-0001,BRE-EE-0005,CTT-DE-0002,LZZ-DE-0011,UZZ-DE-0001", 
                   what = character(), sep = "\n")
    
    library(dplyr)
    bill <- tibble(IA_YES = string)
    

    下次提供一些示例数据是有意义的。例如通过使用dput()(在这种情况下复制dput(bill)的结果。

    解决方案

    请注意,您的代码中的 strsplit 命令会创建一个列表。该列表存储在新创建的列中,可以用作R 中的任何其他列表。我们可以使用purrr包对列表进行操作,它提供了R的*apply函数的更好版本:

    bill %>%
      mutate(NO_IA = strsplit(as.character(IA_YES), ",")) %>% 
      mutate(length = map_int(NO_IA, length))
    #> # A tibble: 6 x 3
    #>   IA_YES                                                    NO_IA    length
    #>   <chr>                                                     <list>    <int>
    #> 1 "AAA-GB-0001 "                                            <chr [1~      1
    #> 2 "BBB-ES-0005,ADD-GB-0001 "                                <chr [2~      2
    #> 3 "BSC-ES-0005,HQQ-GB-0001,REE-GB-0001 "                    <chr [3~      3
    #> 4 "BDD-GB-0001,BSC-ES-0005,HQQ-GB-0001,UZZ-DE-0001 "        <chr [4~      4
    #> 5 "BDD-GB-0001,UEE-DE-0001 "                                <chr [2~      2
    #> 6 BDD-GB-0001,BRE-EE-0005,CTT-DE-0002,LZZ-DE-0011,UZZ-DE-0~ <chr [5~      5
    

    map_int(NO_IA, length) 的简短说明:map 函数都以相同的方式工作。您提供可以转换为列表的列表或向量并对其应用函数。在这种情况下,我们测量列表中每个条目的length()。另一种编写方式是map_int(NO_IA, function(x) length(x))。与apply 函数相比,purrr 的优势在于可以更好地控制输出。 map_int 会返回一个整数,例如map_chr 会返回一个字符对象。

    旧答案

    您可以在转换之前将逗号替换为点:

    library(dplyr)df <- tibble(num = c("12,3", "10.7"))
    df %>% 
      mutate(num = as.numeric(sub(",", ".", num, fixed = TRUE)))
    #> # A tibble: 2 x 1
    #>     num
    #>   <dbl>
    #> 1  12.3
    #> 2  10.7
    

    更“整洁”的版本:

    library(tidyverse)
    df <- tibble(num = c("12,3", "10.7"))
    df %>% 
      mutate(num = str_replace(num, fixed(","), ".") %>%  
               as.numeric())
    #> # A tibble: 2 x 1
    #>     num
    #>   <dbl>
    #> 1  12.3
    #> 2  10.7
    

    【讨论】:

    • 我如何将其作为我的替换专栏。目前你有字符串 12,3 , 10.7.
    • 这句话我没看懂。也许您在问题中包含一些数据,因此更容易为您提供帮助。目前,我的理解是您有一个需要转换为数字的字符列。
    • IA_YES 1.AAA-GB-0001 2.BBB-ES-0005,ADD-GB-0001 3.BSC-ES-0005,HQQ-GB-0001,REE-GB-0001 4. BDD-GB-0001,BSC-ES-0005,HQQ-GB-0001,UZZ-DE-0001 5. BDD-GB-0001,UEE-DE-0001 6. BDD-GB-0001,BRE-EE-0005, CTT-DE-0002,LZZ-DE-0011,UZZ-DE-0001 我需要能够在每个编号的行中计数,用逗号分隔的字符串数。为混乱道歉
    • 我想我现在明白你需要什么了。看看吧。
    • 嗨,JBG - 感谢这项工作,我也能够以另一种方式解决。 ``` bill % mutate(NO_IA = str_count(IA_YES, ",")+1) ``` 只需在每个末尾添加另一个逗号计数即可获得相同的答案(即 1 不会有逗号)。谢谢你的帮助!
    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2019-11-26
    • 1970-01-01
    • 2019-04-17
    相关资源
    最近更新 更多