我必须对数据帧的字符串列执行逐行比较,然后将其与第二个数据帧进行比较。测试数据框架如下所示 -
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
重点是在测试数据框中创建一个新列,以确定它是否为新行。以下是识别新行的条件 -
最终输出数据看起来与此相似 -
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)
这不是最终解决方案。但是,有没有更好的方法来解决它?
答案 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
是您的预期结果。