找到所有玩家在R中转弯的第一个观察点的有效方法

时间:2016-04-04 09:26:17

标签: r loops match

如果我们有玩家A,B,C,D,E,F,并且数据框D的条目中每行的条目等于玩家标签并且有多行。

我想找到一个索引,在该索引处显示D中唯一的团队数量,显然是由length(unique(D$names))给出的。

例如,我们可能有前6行有名称:A,B,C,D,E,F在这种情况下索引= 6.但我们可能有另一种情况,其中A,B,C,D ,A,E,F,在这种情况下索引= 7。我已经完成了以下 clunky 代码:

   for(i in 6:60){

  if (length(unique(D$Team[1:i]))==length(unique(D$Team)))
  {
    print(i)
    break
  }
}

*我从6开始,因为这是所需的最小行数

我认为使用R.中的匹配函数有更好的解决方案,例如"

match(length(unique(D$Team)[i]),length(unique(D$Team)))

2 个答案:

答案 0 :(得分:2)

我们可以使用seq_along()来获取向量的非重复元素的索引,并通过将整个事物包装在max()中来获得最后一个元素的索引。

# Example vector based on your question
vec <- c("A","B","C","D","A","E","F")

# Get index of last non-duplicate element
max(seq_along(vec)[!duplicated(vec)])
#[1] 7

答案 1 :(得分:2)

由于match给出了向量中第一个元素的出现,你可以找到每个唯一元素的第一个匹配的位置,然后取最大值:

max(match(unique(D$Team),D$Team)) 

举个例子:

set.seed(1)
D<-data.frame(Team=sample(LETTERS[1:6],100,TRUE),stringsAsFactors=FALSE)
max(match(unique(D$Team),D$Team))
#[1] 13
D$Team[1:13]
#[1] "B" "C" "D" "F" "B" "F" "F" "D" "D" "A" "B" "B" "E"