2016-07-22 5 views
1

Я пытаюсь создать новый столбец (D $ NEW) в Data.table D, который соответствует каждой строке D ко всему столбцу (D2 $ COLUMN1) в Data.table D2 используя str_subset. (Моя структура данных находится внизу)Как игнорировать капитал, используя lapply (str_subset)

D[,NEW:= lapply(D[,C1],function(x)str_subset(as.character(D2$COLUMN1), x)] 

Это работает нормально. Но я также хочу, чтобы str_subset игнорировал случай с капиталом. Но когда я использую ignore.case (х)

D[,NEW:= lapply(D[,C1],function(x)str_subset(as.character(D2$COLUMN1), ignore.case(x))] 

Я получаю следующую ошибку

## PLEASE use (fixed|coll|regexp)(x, ignore_case=TRUE) 

Когда я использую ignore_case = TRUE

D[,F:= lapply(D[,V1],function(x) str_subset(as.character(D2$COLUMN1), x, ignore_case=TRUE))] 

я получаю следующее сообщение об ошибке:

Error in str_subset(as.character(), x, ignore_case = TRUE) : unused argument (ignore_case = TRUE) 

Как я могу управлять, чтобы заставить игнорировать случаи при использовании этой функции ..

данных:

D<-data.table(C1=c("a","b","c","d","e","A","B","C"), C2=c(1,2,3,4,5,6,7,8,9,10)) 


D2<-data.table(COLUMN1=c("a"), COLUMN2=c("b"), COLUMN3=c(1:10)) 
+1

Попробуйте 'str_subset (as.character (DA $ Participant.row), paste0 ("? (Я)", х))'. Функция ['str_subset'] (http://www.inside-r.org/packages/cran/stringr/docs/str_subset), похоже, не имеет аргумента' ignore_case'. –

+0

@ Давид Аренбург Вы имеете в виду D [, NEW: = str_subset (as.character (D2 $ COLUMN1), C1)] ??Может быть, я не использую лапку правильно, но мне нужно сопоставлять каждую строку отдельно, используя все значения. – Darren

+0

Не обращайте внимания, для вашего желаемого результата кажется, что вам нужно зациклиться на 'C1'. Я неправильно понял ваш вопрос. Я думаю, –

ответ

2

Первая ошибка говорит вам, что вы не можете использовать ignore.case() в качестве функции. Вторая ошибка связана с тем, что str_subset function не имеет аргумента ignore_case.

Используйте встроенный регистронезависимое модификатор (?i):

D[,NEW:= lapply(D[,C1],function(x)str_subset(as.character(D2$COLUMN1), paste0("(?i)",x)))] 
                     ^^^^^^^^^^^^^^^^ 

Дело нечувствительные модификатор рядный (?i) делает то же самое, что, как ignore.case/ignore_case делают. Он делает соответствие нечувствительным к регистру. См. more details on inline modifiers at regular-expressions.info. При размещении в каком-либо месте шаблона часть после него соответствует строке нечувствительным к регистру. Итак, разместив его в начале шаблона, вы делаете весь шаблон нечувствительным к регистру.

Else, вы можете передать TRUE функции regex:

D[,NEW:= lapply(D[,C1],function(x)str_subset(as.character(D2$COLUMN1), regex(x, TRUE)))] 
                     ^^^^^^^^^^^^^^ 

TRUE является значение аргумента ignore_case (вы можете записать его в виде regex(x, ignore_case=TRUE)). Подробнее о параметрах, которые вы можете использовать в stri_opts_regex section here. По какой-то причине case_insensitive=TRUE не работает. Я получил сообщение об ошибке:

Error in stri_opts_regex(case_insensitive = ignore_case, multiline = multiline, :
   formal argument case_insensitive matched by multiple actual arguments

Итак, я должен был заменить его ignore_case.

Результат:

> D 
    C1 C2   NEW 
1: a 1 a,a,a,a,a,a, 
2: b 2    
3: c 3    
4: d 4    
5: e 5    
6: A 6 a,a,a,a,a,a, 
7: B 7    
8: C 8    
9: a 9 a,a,a,a,a,a, 
10: b 10  
+1

* встроенный нечувствительный к регистру модификатор '(? I)' * - тот же, что и 'ignore.case' /' ignore_case'. Делает совпадение без учета регистра. См. [Подробнее о * встроенных модификаторах здесь] (http://www.regular-expressions.info/modifiers.html). При размещении в каком-либо месте шаблона часть после него соответствует строке нечувствительным к регистру. Итак, разместив его в начале шаблона, вы делаете весь шаблон нечувствительным к регистру. –

+0

'regex (x, ignore_case = TRUE)', хорошо, я добавлю объяснения в ответ. –