我有一个庞大的数据框架。一列是1到2的整数。 我需要的是一种在此列中查找具有多个特定值的连续行的方法,将这些行子集化并稍后将其处理为图形。
我附上了一个小例子,它至少完成了一些所需的工作: 我能够打印出我正在寻找的子集。但仍有两个问题:
我已经看过聚合或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
}
答案 0 :(得分:6)
rle
函数对于这样的东西非常方便。它采用原子向量并返回list
元素lengths
和values
,其中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]
)