对R数据框中的字符串列进行逐行比较以创建新列

时间:2016-10-11 18:39:11

标签: r dplyr data-cleaning

我必须对数据帧的字符串列执行逐行比较,然后将其与第二个数据帧进行比较。测试数据框架如下所示 -

pat_id  line_code month_rule
1        r        0
1        chop     0
1        rchop    0
1        rchop    0
1        rchp     0
1        rchp     0
1        rchop    1
1        fr       0
2        f        0
2        fr       0
2        fr       1

工作台数据框(基准)具有用于比较的标准线代码。以下是样本基准数据框架 -

line_code
gb
rc
br
fr
ir
r2
rchop
rcyclo
rcvp
rfnd
rcp
cp

重点是在测试数据框中创建一个新列,以确定它是否为新行。以下是识别新行的条件 -

  1. 如果month_rule为1,则为新行
  2. 对于患者1,直到第6行,它们都属于一条线。这是因为,字符串" r"," chop"," rchp"不属于基准数据框架。
  3. 在第7行中,患者1具有" fr"与基准数据帧匹配的行代码,因此它也是一个新行。
  4. 最终输出数据看起来与此相似 -

    pat_id  line_code month_rule line
    1        r        0          1
    1        chop     0          1
    1        rchop    0          1
    1        rchop    0          1
    1        rchp     0          1
    1        rchp     0          1
    1        rchop    1          2
    1        fr       0          3
    2        f        0          1
    2        fr       0          1
    2        fr       1          2
    

    我的方法是使用dplyr解决这个问题。由于条件太多,我无法达到最终解决方案。以下是我的想法 -

    library(dplyr)
    test<-test%>%rowwise()%>%
          mutate(test$line=ifelse(month_rule==0 & test$line_code!=bench$line_code), 1,0)
    

    这不是最终解决方案。但是,有没有更好的方法来解决它?

1 个答案:

答案 0 :(得分:0)

这应该有效:

test <- test %>% 
  group_by(pat_id) %>% 
  mutate(var1 = (line_code %in% bench$line_code)) %>%
  mutate(var2 = ifelse(row_number() > 1, 
                       mapply(grepl, lag(line_code), line_code),
                       0)) %>%
  mutate(line = 1 + cumsum(month_rule | (var1 & !var2))) %>%
  select(-var1, -var2)
当且仅当var1是基准数据框的一部分时,

line_code才为真。

当且仅当var2是&#34;组合&#34;时,

line_code才属实。 (如你所说)之前的line_code。 (我不确定你想要的是什么,请在你的真实数据集上进行测试)

所以month_rule | (var1 & !var2)是真的,当且仅当月规则得到满足或(药物来自基准数据和新)。因此line是您的预期结果。