【问题标题】:Row wise comparison of a string column in R data frame to create a new columnR数据框中字符串列的逐行比较以创建新列
【发布时间】: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

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

  1. 如果month_rule为1,则为新行
  2. 对于患者 1,直到第 6 行,它都属于一行。这是因为字符串“r”、“chop”、“rchp”不是基准数据帧的一部分。
  3. 在第 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 行。
  • 那么基准数据框的目的是什么? rchopfr 都在基准数据框中,但是您有条件地忽略它们,这对我来说似乎不是一个一致的逻辑。
  • @Psidom 仅当 month_rule==1 和 test$line_code==bench$line_code 时才会出现新行。在所有其他情况下,它要么属于前面的行号,要么属于后面的行号。

标签: r dplyr data-cleaning


【解决方案1】:

这应该可行:

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 为真当且仅当line_code 是前一个line_code 的“组合”(如您所说)。 (我不确定这正是您想要的,请在您的真实数据集上进行测试)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2017-06-12
    • 1970-01-01
    • 2018-10-23
    相关资源
    最近更新 更多