分割和排列字符串列数据

时间:2018-11-02 13:25:58

标签: r

R的新手,所以我有点迷路。 我有一个包含各种变量的数据集,包括以下列“ drink_daily”:

drink_daily <- c("(ID 3) Cola & (ID 1) Sprite",
  "(ID 1) Sprite & (ID 3) Cola",
  "(ID 2) water & (ID 3) Cola & (ID 4) Other",
  "(ID 3) Cola & (ID 1) Sprite & (ID 2) water")

我需要在数据框中添加如下内容:

[1] "1" & "3"
[2] "1" & "3"
[3] "2" & "3" & "4"
[4] "1" & "2" & "3"
  • a)我想将所有字符串按字母(1-4)顺序排列
  • b)将列中的字符串分成4个变量
  • c)将代码重新编码为数字(1-> 4)
  • d)将4列合并为一个

3 个答案:

答案 0 :(得分:2)

您可以从stringrpurrr库中获得一些帮助。例如

library(purrr)
stringr::str_match_all(drink_daily, "\\(ID (\\d+)\\)") %>% 
  map(function(x) x[,2]) %>% 
  map(as.numeric) %>% 
  map(sort) %>% 
  map_chr(paste, collapse=" & ")
# [1] "1 & 3"     "1 & 3"     "2 & 3 & 4" "1 & 2 & 3"

我们使用str_match_all提取字符串“(ID#)”中的数字,然后对其进行排序并将其粘贴回去。

答案 1 :(得分:1)

Justo引入了stringi软件包,该软件包使处理字符串更加容易(尽管其结构与@ Mr.Flick的答案相同),

library(stringi)

sapply(stri_extract_all_regex(drink_daily, '\\d+'), function(i) 
                                              paste(sort(as.numeric(i)), collapse = ' & '))

#[1] "1 & 3"     "1 & 3"     "2 & 3 & 4" "1 & 2 & 3"

答案 2 :(得分:0)

我想出了一些不太漂亮的东西-部分是因为R可能不是执行此操作的最佳工具-但这确实有用。

在这里,strsplit用于分解用'&'分隔的块。
gsub删除括号和“ ID”。
as.numeric将其转换为数字(或者:as.integer)。
排序不需要进一步说明

结果是带有所有ID排序的向量列表。列表项的名称是原始项

df <- c("(ID 3) Cola & (ID 1) Sprite",
        "(ID 1) Sprite & (ID 3) Cola",
        "(ID 2) water & (ID 3) Cola & (ID 4) Other",
        "(ID 3) Cola & (ID 1) Sprite & (ID 2) water")

df2 <- sapply(df,function(x) strsplit(x,split='& *'))

result <- lapply(df2, function(x) {
    sort(as.numeric(gsub(').*','',gsub('\\(ID ','',x))))
})


## Show result:
result
 $`(ID 3) Cola & (ID 1) Sprite`
[1] 1 3

 $`(ID 1) Sprite & (ID 3) Cola`
[1] 1 3

 $`(ID 2) water & (ID 3) Cola & (ID 4) Other`
[1] 2 3 4

 $`(ID 3) Cola & (ID 1) Sprite & (ID 2) water`
[1] 1 2 3