我有一个data.frame ystr:
v1 1 a 2 B 3 B 4 C 5 d 6 a 7 B 8 D
我想在CAPS中找到每组字母的开头和结尾,所以我的输出将是:
groupId startPos endPos 1 1 2 4 2 2 7 8
通过按顺序查看每个元素并将其与之前的元素进行比较,我能够通过for循环来完成它,如下所示:
currentGroupId <-0 for (i in 1:length(ystr[,1])){ if (grepl("[[:upper:]]", ystr[i,])) { if (startCounter == 0) { currentGroupId <- currentGroupId +1 startCounter <-1 mygroups[currentGroupId,] <- c(currentGroupId, i, 0) } }else if (startCounter == 1){ startCounter <-0 mygroups[currentGroupId,3]<- i-1 } }
在R中有一种简单的方法吗?
这可能类似于Mark的开始和结束,但我无法弄清楚它在这种情况下是如何应用的.
您可以通过计算rle
二进制指示符的行程编码()来确定数据是否为大写,这可以通过数据在转换为大写时是否等于自身来确定.
with(rle(d[,1] == toupper(d[,1])), data.frame(start=cumsum(lengths)[values]-lengths[values]+1, end=cumsum(lengths)[values])) # start end # 1 2 4 # 2 7 8
您可以rle
通过使用此命令查看Stack Overflow答案来查看其他使用示例.
数据:
d <- data.frame(v1=c("a", "B", "B", "C", "d", "a", "B", "D"))