【发布时间】:2017-02-20 10:00:53
【问题描述】:
我必须对数据帧的字符串列执行逐行比较,然后将其与第二个数据帧进行比较。测试数据框如下所示 -
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
bench 数据框(benchmark) 有标准行代码供比较。下面是示例基准数据框 -
line_code
gb
rc
br
fr
ir
r2
rchop
rcyclo
rcvp
rfnd
rcp
cp
重点是在测试数据框中创建一个新列,用于标识它是否为新行。以下是识别新行的条件 -
- 如果month_rule为1,则为新行
- 对于患者 1,直到第 6 行,它都属于一行。这是因为字符串“r”、“chop”、“rchp”不是基准数据帧的一部分。
- 在第 7 行中,患者 1 具有与基准数据帧匹配的“fr”行代码,因此它也是一个新行。
最终输出的数据会是这个样子-
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)
这不是最终的解决方案。但是,有没有更好的方法来解决它?
【问题讨论】:
-
rchop在基准数据框中,为什么不在第 3 行的pat_id == 1中引入新行;而fr也在基准数据框中,它不会在第10行为pat_id == 2带来新的一行吗? -
使用
r标签时请通过dput()分享数据。将鼠标悬停在标签上以获取更多信息。 -
@Psidom 基本上,行代码是在一段时间内提供给患者的不同药物。对于第 1 行中的患者 ==1,他只服用“r”药物。在第 2 行,他被给予“c”、“h”、“o”、“p” 药物。在第 3 行,他得到了所有的“rchop”药物,但仍然是第 1 行的一部分。在第 6 行,只给了“rchp”,但它仍然属于该患者的第 1 行。
-
那么基准数据框的目的是什么?
rchop和fr都在基准数据框中,但是您有条件地忽略它们,这对我来说似乎不是一个一致的逻辑。 -
@Psidom 仅当 month_rule==1 和 test$line_code==bench$line_code 时才会出现新行。在所有其他情况下,它要么属于前面的行号,要么属于后面的行号。
标签: r dplyr data-cleaning