【问题标题】:Using a loop to check if certain values exist within multiple columns使用循环检查多个列中是否存在某些值
【发布时间】:2014-11-06 21:51:54
【问题描述】:

我的数据集包含多个列,其中有 6 个称为 ID1、ID2、ID3、ID13、ID23、ID33,其中包含多个 ID。我的目标是检查哪些行包含某些值(在这种情况下,值以 531 或 532 或 533 或 534 开头)并将它们子集到一个新数据集中。

此代码对其中任何列中的 ID 正好为 531 的所有行的数据进行了子集化,但我不知道如何制作它,因此它只检查以 531 开头的值,以及如何制作它检查所有 4 个起始值:531、532、533 和 534(不使用更多条件语句)

ID <- data[which(data$ID1 == '531' | data$ID2 == '531' | data$ID3 == '531' | data$ID13 == '531' | data$ID23 == '531' | data$ID33 == '531'), ]

我基本上是在寻找一种更简单的方法来做到这一点。

这是示例数据和我想要的输出:

Sample Data                 
ID1     ID2     ID3     ID13    ID23    ID33
43645   38894   37338   45617   54419   42716
53123   24277   5323    29160       
22821   26091   46100   65324   22179   12367
        47946           59421   
                1954            9544
63534           53244           4771
59080   32532   41460   34562           15722
30542   11477   13211   11739           26753
29331           5311    7079    534424  5322

Desired Output                  
ID1     ID2     ID3     ID13    ID23    ID33
53123   24277   5323    29160       
63534           53244           4771
29331           5311    7079    534424  5322

我为格式道歉(确实缺少一些数据点)

谢谢

【问题讨论】:

  • 您想要一个数据集,其中仅包含所有三列或至少一列中具有这些值之一的那些行?我想我会使用grepl
  • 建议包含样本数据和所需的输出。

标签: r


【解决方案1】:

虽然您的问题有点不清楚(我不确定您想在此之后对这些行做什么......您可以使用 all 选择所有 id 列都有 TRUE 的行,或者如果至少有一个使用any):

require(data.table)
set.seed(123)
dt = data.table(id1 = sample(525:535), id2=sample(525:535), id3=sample(525:535))
dt2=dt[,lapply(.SD, FUN = function(z) {z >= 531})]
#      id1   id2   id3
# 1: FALSE FALSE  TRUE
# 2:  TRUE  TRUE  TRUE
# 3:  TRUE FALSE FALSE
# 4:  TRUE FALSE  TRUE
# 5:  TRUE  TRUE FALSE
# 6: FALSE FALSE  TRUE
# 7: FALSE  TRUE FALSE
# 8:  TRUE  TRUE FALSE
# 9: FALSE FALSE FALSE
#10: FALSE FALSE FALSE
#11: FALSE  TRUE  TRUE

如果您想保留至少有 1 个 TRUE 的行(这似乎是这种情况,因为在您的 sn-p 中您执行 |),那么您可以简单地执行。

dt[dt2[,rowSums(.SD)>=1]]
#   id1 id2 id3
#1: 528 529 532
#2: 532 531 534
#3: 535 530 530
#4: 534 525 533
#5: 531 534 528
#6: 525 526 531
#7: 527 532 526
#8: 533 533 525
#9: 529 535 535

【讨论】:

  • 所以我只想将行保留在另一个较小的子集中,以便我可以计算和操纵这些观察结果。我想保持原来的 ID 值。感谢您的帮助。
  • 根据我的回答不清楚要保留哪些
猜你喜欢
  • 2017-08-22
  • 2020-03-21
  • 2022-01-18
  • 2017-02-19
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
相关资源
最近更新 更多