2012-02-04 38 views
4

我有一个变量actor这是一个字符串,并包含值如"military forces of guinea-bissau (1989-1992)"和大范围的其他不同的值是相当复杂的。我一直在使用grep()找到符合不同类型演员的角色模式。例如,当actor包含"military forces of",不包含"mutiny of",并且字符串变量country也包含在变量actor中时,我想要将新变量actor_type编码为1基于grep返回代码新变量R

我不知道如何有条件地创建这个新的变量,而不诉诸某种类型的可怕的循环。帮我!

数据看起来大致是这样的:

| | actor            | country   | 
|---+----------------------------------------------------+-----------------| 
| 1 | "military forces of guinea-bissau"     | "guinea-bissau" | 
| 2 | "mutiny of military forces of guinea-bissau"  | "guinea-bissau" | 
| 3 | "unidentified armed group (guinea-bissau)"   | "guinea-bissau" | 
| 4 | "mfdc: movement of democratic forces of casamance" | "guinea-bissau" | 

回答

5

如果数据是在一个data.frame DF:

> ifelse(!grepl('mutiny of' , df$actor) & grepl('military forces of',df$actor) & apply(df,1,function(x) grepl(x[2],x[1])),1,0) 
[1] 1 0 0 0 

grepl返回一个逻辑矢量,这可以被分配给任何,例如df$actor_type

打破了APPART:

!grepl('mutiny of', df$actor)grepl('military forces of', df$actor)满足你的前两个要求。最后一块,apply(df,1,function(x) grepl(x[2],x[1]))为演员中的国家排成一排,greps

+0

好,所以第一部分工作。我不太明白第二部分会发生什么。我没有得到x,x是什么或指数来自何处,他们选择了什么。另外,我知道apply()需要一个函数参数,但是如果我们正在应用grepl(),为什么function(x)仍然在apply()调用中。谢谢btw。 – Zach 2012-02-04 21:23:14

+0

'grepl'将一个字符串作为它的'pattern'参数。要比较国家(第2列)和演员(第1列),你需要''grep''应用'pattern =第2列'的每一行。我做了一个匿名函数来做这个,函数使用的变量是'x'。 '.data.frame'的每一行都作为'grepl'评估的两个字符串的向量发送给函数。清晰如泥我相信 ! – Justin 2012-02-04 21:26:20

+0

没有,这实际上是有道理的。赞同:) – Zach 2012-02-04 21:33:55