7

我有一个巨大的数据框。一列是从 1 到 2 的整数。我需要一种方法来查找在该列中具有多个特定值的连续行,对这些行进行子集化,然后将它们处理成图表。

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

  • 我想 R 中有更聪明的方法,然后在整个 data.frame 上应用“for”循环。有什么提示吗?
  • 我必须将哪个命令放在现在“打印”命令用于存储临时 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
}
4

1 回答 1

6

rle功能对于这样的东西非常方便。它接受一个原子向量并返回一个list带有元素的lengthsvalues,其中lengths包含 中每个值的运行长度values

由于cbind在您的示例中调用 to 将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]
)
于 2012-10-24T13:51:57.413 回答