2016-10-13 10 views
0

Я много искал, но не смог найти решение ... Я думаю, что для многих из вас это непросто ... но не для меня.Точное соответствие частичной строки

df <- data.frame(site = c("11", " 4 , 111", "3,1 ", "4,11111 ")) 
> df 
     site 
1  11 
2 4 , 111 
3  3,1 
4 4,11111 

У меня есть столбец, в котором несколько кодов сайтов могут быть разделены запятой (а не случайными пробелами, которые могут возникнуть). Я пытаюсь найти строки, которые соответствуют интересующим строкам.

Результаты поиска для строк, в которых сайт является 11 или 3 «с (1,3)» соответствует должны, таким образом, вернуться: Я не могу

[1] 1 0 1 0 

, чтобы получить это .. . Я думаю, ответ будет включать в себя

temp <- strsplit(df$site, ",") 

, но я не могу понять, как применять функции в списках после этого шага ... Я бы сделать

grepl(c("^11$", "^3$"), temp) 

но это не работает.

+0

Что представляют собой 1s и 0s? Являются ли они просто «да» и «нет» или они должны указывать количество совпадений в каждой строке? –

+0

Несколько неторопливая версия: 'library (tidyverse); df%>% group_by (row = row_number())%>% separate_rows (site, sep = ',', convert = TRUE)%>% summary (result = as.integer (any ==) 3))) ' – alistaire

ответ

3

Поскольку вы ищете точное соответствие, а не сопоставление с образцом, вы можете попробовать это:

df <- data.frame(site = c("11", " 4 , 111", "3,1 ", "4,11111 "), stringsAsFactors = FALSE) 
as.integer(unlist(lapply(strsplit(df$site, split=","), function(x) any(x == 3 | x == 11)))) 

[1] 1 0 1 0 
+2

Вы тоже можете немного скомпилировать код' sapply (strsplit (df $ site, split = ","), function (x) any (x% in% c (3,11))) ' – thelatemail

+0

Эти изменения сделали его полностью: sapply (strsplit (as.character (df $ site), split =", "), function (x) any (as.numeric (x)% in% c (11,1))). Большое спасибо! – Luc

2

Вы можете попробовать использовать sapply

as.integer(sapply(df$site,function(x)grepl("^11|^3",x))) 

[1] 1 0 1 0 
+0

Поиск результатов «1» только в 1 0 0 0, что неверно. – Luc

1

Мы только можем сделать grep

+(grepl("\\b(3|11)\\b", df$site)) 
#[1] 1 0 1 0