R-过早退出循环

R-过早退出循环,r,loops,R,Loops,我在问一个问题,我试图简化我的数据集,并给出一个我想要的输出的例子。如果这仍然很复杂,请随意发表评论,可能有助于我澄清这一点 我有一个表,其中我对具有相似rt和mz的功能进行了分组 orig_feat mz_mid rt_mid similar_feature 1 f_1 685.4350 466.5 f_1 2 f_2 260.1655 245.0 f_2 185

我在问一个问题,我试图简化我的数据集,并给出一个我想要的输出的例子。如果这仍然很复杂,请随意发表评论,可能有助于我澄清这一点

我有一个表,其中我对具有相似rt和mz的功能进行了分组

          orig_feat   mz_mid rt_mid similar_feature
1           f_1 685.4350  466.5             f_1
2           f_2 260.1655  245.0             f_2
185         f_2 260.1665  256.5           f_185
408         f_2 260.1670  239.0           f_408
2334        f_2 260.1650  250.0          f_2334
3           f_3 288.1980  276.0             f_3
7           f_3 288.1990  289.0             f_7
414         f_3 288.1970  275.0           f_414
2181        f_3 288.1980  270.0          f_2181
2969        f_3 288.1965  297.5          f_2969
4           f_4 537.3915  454.5             f_4
2271        f_4 537.3965  435.5          f_2271
5           f_5 439.2990  153.5             f_5
6           f_6 325.0690  210.5             f_6
10          f_6 325.0685  227.0            f_10
747         f_6 325.0685  184.5           f_747
2068        f_6 325.0695  225.0          f_2068
2929        f_6 325.0685  218.0          f_2929
2970        f_6 325.0680  237.0          f_2970
31          f_7 288.1980  276.0             f_3
71          f_7 288.1990  289.0             f_7
4141        f_7 288.1970  275.0           f_414
21811       f_7 288.1980  270.0          f_2181
29691       f_7 288.1965  297.5          f_2969
我想为每个小组列出一个条目。具有相同$orig_专长的所有行都应该“分组”,对于每个“组”,我需要所有特征的向量。请参见下面的所需输出示例

    $grf_1
[1] "f_1"

$grf_2
[1] "f_2"    "f_185"  "f_408"  "f_2334"

$grf_3
[1] "f_3"    "f_7"    "f_414"  "f_2181" "f_2969"

$grf_4
[1] "f_4"    "f_2771"

$grf_5
[1] "f_5"

$grf_6
[1] "f_6"    "f_10"   "f_747"  "f_2068" "f_2929" "f_2970"
但重要的是,我希望这是非冗余的(例如,gf_3:包含f_7、f_414、f_2181、f_2696,因此当我到达f_7时,我不会为f_7创建一个组,因为f_3组allready包含f_7组中的所有功能)

下面是我的代码。目前,生产的输出在grf_3之后停止。 我不知道为什么它似乎过早地退出循环

mkFeatGroupsList<-function(simFeatsTab){
  features_seen<-vector()
  GroupingList<-list()
  counter=1
  for (i in 1:length(unique(simFeatsTab$orig_feat))){
    orig_feat2Grp<-simFeatsTab$orig_feat[i]
    if (orig_feat2Grp%in%features_seen == TRUE) next
    matchingFeats<-subset(simFeatsTab,orig_feat==orig_feat2Grp)$feature
    grFeatNm<-paste("grf_",counter,sep="")
    GroupingList[[grFeatNm]]<-matchingFeats
    features_seen<-c(features_seen,matchingFeats)
    counter=counter+1
  }
  return(GroupingList)
}
我这样说:

  • 将数据帧(我称之为
    feat
    )按
    orig_feat

  • 使用
    sapply
    获取相关功能

  • 循环浏览相关功能并消除重复项

也就是说:

feat.split <- split(feat, my.df$orig_feat)

sim.feat <- sapply(feat.split, function(x){x$similar_feature})

for (i in 2:length(sim.feat))
  {
  # Get all of the previous features
  prev.feat <- do.call("c", sim.feat[1:(i-1)])

  # Remove features already used
  sim.feat[[i]] <- sim.feat[[i]][!sim.feat[[i]] %in% prev.feat]
  }
feat.split我这样做:

  • 将数据帧(我称之为
    feat
    )按
    orig_feat

  • 使用
    sapply
    获取相关功能

  • 循环浏览相关功能并消除重复项

也就是说:

feat.split <- split(feat, my.df$orig_feat)

sim.feat <- sapply(feat.split, function(x){x$similar_feature})

for (i in 2:length(sim.feat))
  {
  # Get all of the previous features
  prev.feat <- do.call("c", sim.feat[1:(i-1)])

  # Remove features already used
  sim.feat[[i]] <- sim.feat[[i]][!sim.feat[[i]] %in% prev.feat]
  }

feat.split另一种解决方案可以使用
igraph
软件包:

 require(igraph)
 x<-graph.data.frame(df[,c(1,4)])
 #You can also take a look with plot(x)
 res<-clusters(x)
 split(names(res$membership),res$membership)
 #$`1`
 #[1] "f_1"
 #$`2`
 #[1] "f_2"    "f_185"  "f_408"  "f_2334"
 #$`3`
 #[1] "f_3"    "f_7"    "f_414"  "f_2181" "f_2969"
 #$`4`
 #[1] "f_4"    "f_2271"
 #$`5`
 #[1] "f_5"
 #$`6`
 #[1] "f_6"    "f_10"   "f_747"  "f_2068" "f_2929" "f_2970"
require(igraph)

x另一种解决方案可以使用
igraph
软件包:

 require(igraph)
 x<-graph.data.frame(df[,c(1,4)])
 #You can also take a look with plot(x)
 res<-clusters(x)
 split(names(res$membership),res$membership)
 #$`1`
 #[1] "f_1"
 #$`2`
 #[1] "f_2"    "f_185"  "f_408"  "f_2334"
 #$`3`
 #[1] "f_3"    "f_7"    "f_414"  "f_2181" "f_2969"
 #$`4`
 #[1] "f_4"    "f_2271"
 #$`5`
 #[1] "f_5"
 #$`6`
 #[1] "f_6"    "f_10"   "f_747"  "f_2068" "f_2929" "f_2970"
require(igraph)

汉克斯,这太好了。现在,在删除以前的功能后,有一些空元素。我试着用这个来移除它们,但没用。其他建议?sim.feat0]@user2814482:试试
sim.feat[sapply(sim.feat,length)>0]
谢谢,这太棒了。现在,在删除以前的功能后,有一些空元素。我试着用这个来移除它们,但没用。其他建议?sim.feat0]@user2814482:试试
sim.feat[sapply(sim.feat,length)>0]