Jak wybrać dane R.wiersze tabeli oparte na dopasowaniu podłańcucha (a la SQL like)

Mam dane.tabela z kolumną znakową i chce wybrać tylko te wiersze, które zawierają podłańcuch w niej. Odpowiednik SQL WHERE x LIKE '%substring%'

Np.

> Months = data.table(Name = month.name, Number = 1:12)
> Months["mb" %in% Name]
Empty data.table (0 rows) of 2 cols: Name,Number

Jak wybrać tylko wiersze, w których nazwa zawiera "mb"?

Author: Corone, 2013-01-31

2 answers

data.table posiada funkcję {[4] }.

Months[like(Name,"mb")]
        Name Number
1: September      9
2:  November     11
3:  December     12

Lub, %like% wygląda ładniej:

> Months[Name %like% "mb"]
    Name Number
1: September      9
2:  November     11
3:  December     12

Zauważ, że %like% i like() używają grepl (zwraca wektor logiczny) zamiast grep (zwraca miejsca całkowite). Dlatego można go łączyć z innymi warunkami logicznymi:

> Months[Number<12 & Name %like% "mb"]
        Name Number
1: September      9
2:  November     11

I otrzymujesz moc wyszukiwania wyrażeń regularnych (nie tylko % lub * wildcard).

 75
Author: Matt Dowle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-31 16:56:07

Operator %in% nie wykonuje częściowego dopasowania ciągu znaków jest on używany do znajdowania, czy wartości istnieją w innym zbiorze wartości tj. "a" %in% c("a","b","c")

Do częściowego dopasowania łańcuchów należy użyć funkcji grep(). Możesz użyć grep, aby zwrócić indeks wszystkich kolumn z "mb". Następnie podgrupuj wiersze według tego indeksu

Months[grep("mb", Name)]    # data.table syntax slightly easier
 8
Author: LostLin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-31 16:39:50