【问题标题】:Code new variable based on grep return in R根据 R 中的 grep 返回编码新变量
【发布时间】:2012-02-26 23:44:39
【问题描述】:

我有一个变量actor,它是一个字符串,包含"military forces of guinea-bissau (1989-1992)" 之类的值以及大量其他相当复杂的不同值。我一直在使用grep() 来查找匹配不同类型演员的角色模式。例如,当actor包含"military forces of",不包含"mutiny of"时,我想将一个新变量actor_type编码为1,并且字符串变量country也包含在变量actor中.

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

数据大致如下:

|   | 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" |

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    如果您的数据位于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.

    打破那个装置:

    !grepl('mutiny of', df$actor) 和 grepl('military forces of', df$actor) 满足您的前两个要求。最后一块,apply(df,1,function(x) grepl(x[2],x[1])) 逐行排列,greps 代表国家/地区演员。

    【讨论】:

    • 好的,所以第一部分有效。我不太明白第二部分发生了什么。我不知道 x,x 是什么,也不知道索引来自哪里,他们在选择什么。另外,我知道 apply() 接受一个函数参数,但如果 grepl() 是我们正在应用的,为什么 function(x) 仍在 apply() 调用中。谢谢顺便说一句。
    • grepl 将单个字符串作为其pattern 参数。要将国家/地区(第 2 列)与演员(第 1 列)进行比较,您需要将apply grepl 与pattern=column 2 对应到每一行。我创建了一个匿名函数来执行此操作,该函数使用的变量是x。 .data.frame 的每一行作为grepl 评估的两个字符串的向量发送到函数。我敢肯定,一清二楚!
    • 不,这实际上是有道理的。赞赏:)
    • 现在出现错误:“data$actor1 & apply(data, 1, function(x) grepl(x[13], x[2])) 中的错误:操作只能用于数字, 逻辑或复杂类型”,因为国家变量是一个字符串。
    猜你喜欢
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多