【问题标题】:Creating a new variable- is there a better way? [duplicate]创建一个新变量 - 有没有更好的方法? [复制]
【发布时间】:2020-08-01 11:15:38
【问题描述】:

我有一个包含大约 200 万个样本的数据集。有 30 列用于编码的诊断,每列标记为 I10_DX1 到 I10_DX30。我需要从这些现有列中创建一个新变量。

比如data=CHD_2016,我想生成的新变量是=tetralogy。如果 I10_DX1 到 I10_DX30 列中的任何代码具有 Q0[01234567],它将被编码为 1,否则为 0。我可以使用下面的代码使其工作。但是,我认为必须有一种更短更好的方法来做到这一点。在 stata 中,我可以使用循环在几行中做到这一点。有人能推荐一个更好的方法吗!

CHD_2016$tetralogy<- ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX1), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX2), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX3), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX4), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX5), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX6), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX7), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX8), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX9), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX10), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX11), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX12), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX13), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX14), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX15), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX16), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX17), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX18), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX19), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX20), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX21), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX22), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX23), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX24), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX25), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX26), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX27), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX28), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX29), 1, 0)|
          ifelse(grepl("Q0[01234567]", CHD_2016$I10_DX30), 1, 0) ```

【问题讨论】:

  • 你能提供一些使用dput(head(df))的示例数据吗?
  • 嗨-这是这样的数据:I10_DX1 = structure(c(4970L, 8006L, 16246L, 16247L, 16246L, 7696L), .Label = c("", "A000", "A0100" 、“A0109”、“A011”、“A020”、“A021”、“A0220”、“A0221”、“A0223”、“A0224”、“A0225”、“A0229”、“A028”、“A029”、“ A030”、“A031”、“A033”、“A038”、“A039”、“A040”、“A041”、“A042”、“A043”、“A044”、“A045”、“A046”、“A047” ,“A048”,“A049”,“A050”,“A051”,“A058”,“A059”,“A060”,
  • 括号没有关闭。您可以在问题中发布数据示例吗?

标签: r loops


【解决方案1】:

您可以尝试将lapplyReduce 一起用于选定的列

cols <- grep('I10_DX', names(CHD_2016))
CHD_2016$tetralogy <- as.integer(Reduce(`|`, lapply(CHD_2016[cols], 
                                 grepl, pattern = "Q0[01234567]")))

还有sapplyrowSums

CHD_2016$tetralogy <- as.integer(rowSums(sapply(CHD_2016[cols], 
                                 grepl, pattern = "Q0[01234567]")) > 0)

【讨论】:

  • 谢谢!有效。与我的代码相比,它看起来很整洁。
  • 刚刚做了。我在 stackoverflow 上得到的一些答案给我留下了深刻的印象。
【解决方案2】:

假设您的数据变量代码存储为字符串,您可以将%in% 运算符与for 循环一起使用。超过数百万个数据点,但我认为涉及 lapply 而不是 for 循环的解决方案会快得多。

# Example data
ID10_DX1 <- sample(LETTERS)[1:20]
ID10_DX2 <- sample(LETTERS)[1:20]
ID10_DX3 <- sample(LETTERS)[1:20]
ID10_DX4 <- sample(LETTERS)[1:20]
ID10_DX5 <- sample(LETTERS)[1:20]
ID10_DX6 <- sample(LETTERS)[1:20]
ID10_DX7 <- sample(LETTERS)[1:20]
ID10_DX8 <- sample(LETTERS)[1:20]
ID10_DX9 <- sample(LETTERS)[1:20]
ID10_DX10 <- sample(LETTERS)[1:20]
CHD_2016 <- data.frame(ID10_DX1,ID10_DX2,ID10_DX3,ID10_DX4,ID10_DX5,ID10_DX6,ID10_DX7,ID10_DX8,ID10_DX9,ID10_DX10)

# Makes character variables for example data. 
# Not part of the solution and don't use on your own data.
CHD_2016[] <- lapply(CHD_2016, function(x) as.character(x)) 

# This following solution should work to find string "X" in any column
# and report in tetralogy column
string <- "X"
CHD_2016$tetralogy <- c()
for (i in 1:nrow(CHD_2016)) { 
  CHD_2016$tetralogy[i] <- string %in% CHD_2016[i,]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2011-04-04
    • 2020-06-10
    • 2014-04-06
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多