从字符串创建列表/向量

时间:2019-08-16 17:44:55

标签: r

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

现在,当我在数据框(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”)。

我不确定现在如何删除或取消列出此内容。

3 个答案:

答案 0 :(得分:0)

如果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)

答案 1 :(得分:0)

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

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来获取每个医疗设备提交和设备代码的行。

答案 2 :(得分:0)

尝试

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