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"
答案 0 :(得分:2)
您可以从stringr
和purrr
库中获得一些帮助。例如
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