【问题标题】:Creating List/Vector from a String从字符串创建列表/向量
【发布时间】:2019-08-16 17:44:55
【问题描述】:

我正在从数据框中读取包含医疗设备提交编号的列。理想情况下,只有 1 个数字应与医疗设备相关联。但是,在某些情况下,医疗设备有多个编号。我想创建一个包含多个数字的列表。

所以现在,当我在数据框 (deviceRecallsReports) 列“k_numbers”周围循环时,我得到以下输出:

[1] "K020386"

[1] "c(\"K032509\", \"K093308\", \"K082566\")"

[1] "K082829"

[1] "K043520"

[1] "c(\"K040738\", \"K061414\")"

[1] "K080391"

[1] "K991569"

[1] "c(\"K032509\", \"K093308\", \"K082566\")"

[1] "c(\"K032509\", \"K093308\", \"K082566\")"

[1] "c(\"K032509\", \"K093308\", \"K082566\")"

[1] "K063454"

[1] "K053240"

[1] "c(\"K032509\", \"K093308\", \"K082566\")"

[1] "K043520"

[1] "c(\"K032509\", \"K093308\", \"K082566\")"

[1] "K141967"

[1] "c(\"K032509\", \"K093308\", \"K082566\")"

[1] "K991569"

[1] "K013931"


for (row in 1:nrow(deviceRecallsReports)) 
{
               knum <- deviceRecallsReports[row, "k_numbers"]
               print(paste(knum))
}

只有一个数字的行,例如“K020386”或“K991569”。但是对于假定列表“c(\"K032509\", \"K093308\", \"K082566\")" 中的多个数字的其余行,我想创建一个实际的 R 向量或列出.所以我想要一个向量/列表: (“K032509”、“K093308”、“K082566”)。

我现在不知道如何删除或取消列出它。

【问题讨论】:

  • R 中该列的类是什么?可以申请sapply(data,class)吗?

标签: r


【解决方案1】:

如果deviceCallreports是一个普通的data.frame,而你的列k_numbers是一个普通的字符列,我们可以解析它。 唯一的问题是有两种不同类型的条目;普通文本条目和解析向量。因此,请尝试以下操作:

my_parse <- function(s) {
   tryCatch({ eval(parse(text=s)) }, error = function(e) { s })
}
# either
knum <- my_parse(deviceRecallsReports[row, "k_numbers"])
# or
sapply(deviceRecallsReports$k_numbers, my_parse)

【讨论】:

    【解决方案2】:

    不确定实际数据框的结构如何,但我假设它是这样的

    library (tidyverse)
    df <- tibble(
        med_device_string = c(
        "K020386",
        "c(\"K032509\", \"K093308\", \"K082566\")",
        "K082829",
        "K043520",
        "c(\"K040738\", \"K061414\")",
        "K080391",
        "K991569",
        "c(\"K032509\", \"K093308\", \"K082566\")"
      )
    ) %>%
      rowid_to_column("med_device_number") 
    
    
    df %>%
      mutate(med_device_string = str_remove_all(med_device_string, 'c\\(\\"|\\"\\)')) %>% 
      mutate(med_device_list = str_split(med_device_string, pattern = '\\", \\"')) %>% 
      select(-med_device_string)
    

    新列将包含一个单独的字符串列表。在此之后您可以随时致电unnest 以获取每个医疗设备提交和设备代码的行。

    【讨论】:

    • for (row in 1:nrow(deviceRecallsReports)) { knum
    • [1] "c(\"K032509\", \"K093308\", \"K082566\") knum 长度:1 med_device_stringk: c(\"K032509\", \"K093308\ ", \"K082566\")" stri_replace_all_regex(string, pattern, fix_replacement(replacement), 中的警告:参数不是原子向量;强制
    • [1] "K003939 knum 长度:1 med_device_stringk: K003939"
    • 似乎对于“K003939”等单项设备编号,它没有向我显示任何警告。但是对于“c(\"K032509\", \"K093308\", \"K082566\")",它告诉我参数不是原子向量。
    • 您仍然没有提供数据集的最小可重现示例,因此我很难猜测所有内容的结构。
    【解决方案3】:

    试试

    purrr::map(deviceRecallsReports$k_numbers, ~if(grepl("^c", .x)) eval(parse(text = .x)) else .x)
    

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 2013-04-14
      • 2021-06-25
      • 2011-04-20
      • 2012-09-05
      • 2016-02-13
      • 2016-12-02
      • 1970-01-01
      • 2014-02-10
      相关资源
      最近更新 更多