如何在行中搜索相等的变量(以智能方式)并按行存储为子集?

时间:2012-10-24 13:31:04

标签: r

我有一个庞大的数据框架。一列是1到2的整数。 我需要的是一种在此列中查找具有多个特定值的连续行的方法,将这些行子集化并稍后将其处理为图形。

我附上了一个小例子,它至少完成了一些所需的工作: 我能够打印出我正在寻找的子集。但仍有两个问题:

  • 我猜R中有更聪明的方法可以在完整的data.frame上应用“for”循环。任何提示?
  • 我必须在哪个命令中放入“print”命令来存储临时data.frame?由于子集的长度不同,我想我需要一个列表...

我已经看过聚合或ddply,但无法提出解决方案。

非常感谢任何帮助。

test<-c(rep(1,3),rep(2,5),rep(1,3),rep(2,3),rep(1,3),rep(2,8),rep(1,3)) 
letters<-c("a","b","c","d")
a1<-as.data.frame(cbind(test,letters))

BZ<-2   #The variable to look for
n_BZ=4  #The number of minimum appearences

k<-1  # A variable to be used as a list item index in which the subset will be stored

for (i in 2:nrow(a1)){
  if (a1$test[i-1]!=BZ & a1$test[i]==BZ)      # When "test" BECOMES "2"
    {t_temp<-a1[i,]}                            #... start writing a temporary array
  else if (a1$test[i-1]==BZ & a1$test[i]==BZ) # When "test" REMAINS "2"
    {t_temp<-rbind(t_temp,a1[i,])}              #... continue writing a temporary array 
  else if (a1$test[i-1]==BZ & a1$test[i]!=BZ) # When "test" ENDS BEING "2"
    {if (nrow(t_temp)>n_BZ)                     #... check if the temporary array has more rows then demanded
      {print(t_temp)                              #... print the array (desired: put the array to a list item k)
       k<-k+1}}                                   #... increase k
    else                                      # If array too small
    {t_temp<-NULL}                              # reset
}

1 个答案:

答案 0 :(得分:6)

rle函数对于这样的东西非常方便。它采用原子向量并返回list元素lengthsvalues,其中lengths包含values中每个值的运行长度。

由于您示例中对cbind的调用会将test列强制转换为factor,因此我首先将其转换为numeric

a1 <- within(a1, test <- as.numeric(as.character(test)))

然后,结果可以通过一个很好的(基本上)单行获得:

with(rle(a1$test),
    split(a1, rep(seq_along(lengths), lengths))[values == BZ & lengths >= n_BZ]
)