2016-07-22 23 views
1

我试图创造Data.table d其中d的每一行相匹配的Data.table D2一整列(D2 $ COLUMN1)新的一列(d $ NEW)使用str_subset。 (我的数据结构在底部)如何使用lapply(str_subset)到忽略资本

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

这工作正常。 但我也希望str_subset忽略大小写。 但是当我使用ignore.case(X)

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( “?(我)”,X))'。的['str_subset'](http://www.inside-r.org/packages/cran/stringr/docs/str_subset)功能似乎不具有任何'ignore_case'参数。 –

+0

@大卫Arenburg你的意思,d [,NEW:= str_subset(as.character(D2 $ COLUMN1),C1)] ??也许我没有正确使用lapply,但我需要使用每个值分别匹配每行 – 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。当放置在模式的某个位置时,它后面的部分以不区分大小写的方式匹配字符串。因此,通过将它放置在模式的开头,可以使整个模式不区分大小写。

否则,可能会传递TRUEregex功能:

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

TRUEignore_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'相同。使匹配不区分大小写。请参阅[更多* inline修饰符*的细节](http://www.regular-expressions.info/modifiers.html)。当放置在模式的某个位置时,它后面的部分以不区分大小写的方式匹配字符串。因此,通过将它放置在模式的开头,可以使整个模式不区分大小写。 –

+0

'正则表达式(x,ignore_case = TRUE)',好的,我会将解释添加到答案中。 –