【问题标题】:Keep rows with certain values within a data frame and delete all others [R]在数据框中保留具有某些值的行并删除所有其他行 [R]
【发布时间】:2013-09-14 17:57:54
【问题描述】:

我正在使用 R

set.seed(1)
Data <- data.frame(id = seq(1, 10), 
               Diag1 = sample(c("A123", "B123", "C123"), 10, replace = TRUE), 
               Diag2 = sample(c("D123", "E123", "F123"), 10, replace = TRUE), 
               Diag3 = sample(c("G123", "H123", "I123"), 10, replace = TRUE), 
               Diag4 = sample(c("A123", "B123", "C123"), 10, replace = TRUE), 
               Diag5 = sample(c("J123", "K123", "L123"), 10, replace = TRUE), 
               Diag6 = sample(c("M123", "N123", "O123"), 10, replace = TRUE), 
               Diag7 = sample(c("P123", "Q123", "R123"), 10, replace = TRUE))
Data

我有一个这样的数据框。实际上,它有 34 个变量和 1.5 个 Mio 观测值。 它是一个包含患者数据的数据框。 (ID 和诊断(ICD10)A123 和 B123 代表某些诊断。我想提取所有具有这些诊断的患者。事实上,我正在寻找 100 个不同 ICD10 诊断中的 6 个诊断。我寻找的每一个诊断都可以是出现在任何列但它们是互斥的。最后我将有一个大约 4000 个观测值的数据框,而不是 1.5 个 Mio。

我的目标是获得一个数据框,我只保留包含 A123 或 B123 的行。 A123 和 B123 不能在同一行。但它们可以出现在每一列中。

当我这样做时,我设法为一个变量做到这一点:

DataA123 <- Data[Data$Diag1 == "A123", ]

但我想对每个变量以及 A123 和 B123(实际上有 6 个这样的因素)一起做。

这可能吗?

【问题讨论】:

  • 您使用什么语言或框架?
  • 我使用 R。对不起,我是这个论坛和这个东西的新手。我搜索了论坛并没有找到答案。
  • 欢迎来到 SO。你的意思是你需要所有变量都有 A123 或所有变量都有 B123 的数据名吗?你能提供预期的输出吗?
  • 谢谢!它是一个包含患者数据的数据框。 (ID 和诊断(ICD10)A123 和 B123 代表某个诊断。我想提取所有具有这些诊断的患者。事实上,我正在寻找 100 种不同 ICD10 诊断中的 6 个诊断。我寻找的每一个诊断都可以可以出现在任何列中,但它们是互斥的。最后我将有一个大约 4000 个观测值的数据框,而不是 1.5 个 Mio。
  • @Roccer,在发布这类涉及随机数据的问题时,使用set.seed 会很有帮助。

标签: r rows


【解决方案1】:

这个怎么样?

选择所有带有 A123 和/或 B123 的行:

Data[apply(Data,1,function(x) {any(c("A123", "B123") %in% x)}),]

选择所有带有 A123 或 B123 的行:

Data[apply(Data,1,function(x) {Reduce(xor, c("A123", "B123") %in% x)}),]

【讨论】:

  • +1 表示这些替代方案。在我看来,这两个选项都与 OP 可能正在寻找的内容有些匹配。当然,只有他们知道那是什么! :p
  • 太棒了!这正是我一直在寻找的!非常感谢。
  • @AnandaMahto,也感谢您的帮助!下一个问题的结构会更好:)
  • 我的荣幸。别忘了accept an answer ;)
【解决方案2】:
set.seed(1)

  ll<-as.list(names(Data)[-1])

对于 A123:

Map(function(x) Data[Data[x][[1]]=="A123",],ll)


  [[1]]
   id Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
1   1  A123  D123  I123  B123  L123  N123  R123
5   5  A123  F123  G123  C123  K123  M123  Q123
10 10  A123  F123  H123  B123  L123  N123  R123

[[2]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[3]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[4]]
  id Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
4  4  C123  E123  G123  A123  K123  M123  P123
8  8  B123  F123  H123  A123  K123  N123  R123

[[5]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[6]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[7]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

对于 B123:

Map(function(x) Data[Data[x][[1]]=="B123",],ll)



 [[1]]
  id Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
2  2  B123  D123  G123  B123  K123  O123  P123
3  3  B123  F123  H123  B123  L123  N123  Q123
8  8  B123  F123  H123  A123  K123  N123  R123
9  9  B123  E123  I123  C123  L123  N123  P123

[[2]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[3]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[4]]
   id Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
1   1  A123  D123  I123  B123  L123  N123  R123
2   2  B123  D123  G123  B123  K123  O123  P123
3   3  B123  F123  H123  B123  L123  N123  Q123
10 10  A123  F123  H123  B123  L123  N123  R123

[[5]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[6]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[7]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

对于 A123 或 B123:

 Map(function(x) Data[Data[x][[1]]=="A123"|Data[x][[1]]=="B123",],ll)



 [[1]]
   id Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
1   1  A123  D123  I123  B123  L123  N123  R123
2   2  B123  D123  G123  B123  K123  O123  P123
3   3  B123  F123  H123  B123  L123  N123  Q123
5   5  A123  F123  G123  C123  K123  M123  Q123
8   8  B123  F123  H123  A123  K123  N123  R123
9   9  B123  E123  I123  C123  L123  N123  P123
10 10  A123  F123  H123  B123  L123  N123  R123

[[2]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[3]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[4]]
   id Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
1   1  A123  D123  I123  B123  L123  N123  R123
2   2  B123  D123  G123  B123  K123  O123  P123
3   3  B123  F123  H123  B123  L123  N123  Q123
4   4  C123  E123  G123  A123  K123  M123  P123
8   8  B123  F123  H123  A123  K123  N123  R123
10 10  A123  F123  H123  B123  L123  N123  R123

[[5]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[6]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

[[7]]
[1] id    Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
<0 rows> (or 0-length row.names)

【讨论】:

    【解决方案3】:

    如果我正确理解了您的问题,您也许可以使用以下内容:

    Data[rowSums(cbind(rowSums(Data == "A123"), 
                       rowSums(Data == "B123")) != 0) == 1, ]
    

    (但我不确定它对您的实际数据有多有效,尤其是因为您必须制作几个中间大型矩阵)。


    基本思路如下:

    • rowSums(Data == "A123") 告诉我们“A123”在每行中出现了多少次。
    • rowSums(Data == "B123") 告诉我们“B123”在每行中出现了多少次。
    • cbind 将它们两个放在一起作为一个两列矩阵。
    • 由于“A123”和“B123”不能在同一行,我们再次计算rowSums以找出有多少行只有其中一个存在(即使它存在不止一次)。
    • 从那里开始,它是基本子集。

    这是一个例子:

    set.seed(1)
    Data <- data.frame(id = seq(1, 10), 
                   Diag1 = sample(c("A123", "B123", "C123"), 10, replace = TRUE), 
                   Diag2 = sample(c("D123", "E123", "F123"), 10, replace = TRUE), 
                   Diag3 = sample(c("G123", "H123", "I123"), 10, replace = TRUE), 
                   Diag4 = sample(c("A123", "B123", "C123"), 10, replace = TRUE), 
                   Diag5 = sample(c("J123", "K123", "L123"), 10, replace = TRUE), 
                   Diag6 = sample(c("M123", "N123", "O123"), 10, replace = TRUE), 
                   Diag7 = sample(c("P123", "Q123", "R123"), 10, replace = TRUE))
    Data
    #    id Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
    # 1   1  A123  D123  I123  B123  L123  N123  R123
    # 2   2  B123  D123  G123  B123  K123  O123  P123
    # 3   3  B123  F123  H123  B123  L123  N123  Q123
    # 4   4  C123  E123  G123  A123  K123  M123  P123
    # 5   5  A123  F123  G123  C123  K123  M123  Q123
    # 6   6  C123  E123  H123  C123  L123  M123  P123
    # 7   7  C123  F123  G123  C123  J123  M123  Q123
    # 8   8  B123  F123  H123  A123  K123  N123  R123
    # 9   9  B123  E123  I123  C123  L123  N123  P123
    # 10 10  A123  F123  H123  B123  L123  N123  R123
    
    Data[rowSums(cbind(rowSums(Data == "A123"), 
                       rowSums(Data == "B123")) != 0) == 1, ]
    #   id Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
    # 2  2  B123  D123  G123  B123  K123  O123  P123
    # 3  3  B123  F123  H123  B123  L123  N123  Q123
    # 4  4  C123  E123  G123  A123  K123  M123  P123
    # 5  5  A123  F123  G123  C123  K123  M123  Q123
    # 9  9  B123  E123  I123  C123  L123  N123  P123
    

    请注意,来自源 10 行 data.frame

    • 第 1、8 和 10 行被删除,因为它们同时包含“A123”和“B123”。
    • 第 6 行和第 7 行被删除,因为它们既不“A123”也不包含“B123”。

    【讨论】:

      猜你喜欢
      • 2014-03-14
      • 1970-01-01
      • 2018-11-02
      • 2015-10-19
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      相关资源
      最近更新 更多