R - 为多个值检查多个列 - 循环

时间:2017-07-07 21:30:39

标签: r loops

我有一个包含多个诊断列的数据集(即DIAG1,DIAG2,DIAG3等)。我希望创建一个循环来检查我的所有行的每一列,但我在每个列中都要查找多个诊断代码。

例如,我想在DIAG1,DIAG2,DIAG3等中找到代码xxx1和xxx3。

我的代码在下面的位置 1. df =我的数据帧
2. df $ illness =是我想要创建的变量 3. xxxx1 =代码我正在寻找
4. [26:34,57:72] = DIAG1等存在的列

**编辑: 示例数据:

DIAG3  DIAG4  DIAG5  DIAG6
1231   xxx1   5468   5468
1454   2352   4542   4864
xxx2   1235   1234   3564
1234   1589   xxx1   8498

我尝试执行的代码:

for (i in 1:nrow(df)) {
df$illness[i] <- ("xxx1" %in% df[i,26:34, 57:72] | "xxx3" %in% 
df[i,26:34, 57:72]}

我希望循环执行:

DIAG3  DIAG4  DIAG5  DIAG6  Illness
1231   xxx1   5468   5468   TRUE
1454   2352   4542   4864   FALSE
xxx3   1235   1234   3564   TRUE
1234   1589   xxx1   8498   TRUE

代码运行但永远不会结束。我不知道我的错误在哪里。谢谢

3 个答案:

答案 0 :(得分:1)

看起来 df 的子设置错误。 应该是df[i,c(26:34,57:72)]df$illness[i]应该是一个列表吗?

答案 1 :(得分:0)

我们可以通过循环遍历列来执行此操作,使用grepl创建逻辑vector,然后使用Reduce vector查看| df1$Illness <- Reduce(`|`, lapply(df1, grepl, pattern = "xxx")) df1$Illness #[1] TRUE FALSE TRUE TRUE db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] }) }

db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])

答案 2 :(得分:0)

我假设xxxx1实际上应该是一个数值,那么你可以简单地使用ifelse语句,例如:

dat <- data.frame(DIAG3 = c(1231,1454,2222,1234),
                    DIAG4 = c(1111,2352,1235,1589),
                    DIAG5 = c(5468,4542,1234,1111),
                    DIAG6 = c(5468,4864,3564,8498))

library(dplyr)
dat %>% 
    rowwise() %>% 
    mutate(Illness = ifelse(DIAG3==1111 | DIAG4==1111 | DIAG5==1111 | DIAG6==1111|
                                    DIAG3==2222 | DIAG4==2222 | DIAG5==2222 | DIAG6==2222, "TRUE", "FALSE"))