2014-11-06 78 views
0

我的数据集包含多个列,其中有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 

我的格式道歉(有些数据点确实丢失)

感谢

+0

你想要一个数据集,只有那些在所有三列中至少有一个值的行吗?我想用'grepl'。 – Elin 2014-11-06 22:13:33

+0

建议包含样本数据和期望的输出。 – KFB 2014-11-06 22:15:07

+0

如果您发现答案可以接受,请记得接受它,以便将问题关闭。 – Alex 2014-11-07 05:12:38

回答

2

虽然你的问题是有点不清楚(我不知道你想在这之后用这些行做什么..你可以使用all或者如果至少有一个使用any)来选择所有id列具有TRUE的行:

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行(这似乎因为在你的代码片段你做|是这种情况),那么你可以简单地做。

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 
+0

所以我只想将行保留在另一个较小的子集中,以便可以计算和操纵这些观察值。我想维护原始的ID值。 感谢您的帮助。 – Mixcels 2014-11-06 22:20:27

+0

好的,那么我的答案可以解决你的问题? – Alex 2014-11-06 22:32:11

+0

不清楚*你想保留哪些行* – Alex 2014-11-06 22:40:53

相关问题