我有一个标准的“可以避免循环”问题,但找不到解决方案。
我通过@splaisan回答了这个问题,但我不得不在中间部分诉诸一些丑陋的扭曲,并进行一个for
和多个if
测试。我在这里模拟一个更简单的版本,希望有人能给出更好的答案...
问题
给定这样的数据结构:
df <- read.table(text = 'type
a
a
a
b
b
c
c
c
c
d
e', header = TRUE)
我想识别相同类型的连续块并将它们标记为组。第一个块应标记为 0,下一个块应标记为 1,依此类推。有无限数量的块,每个块可能只有一个成员那么短。
type label
a 0
a 0
a 0
b 1
b 1
c 2
c 2
c 2
c 2
d 3
e 4
我的解决方案
我不得不求助于一个for
循环来做到这一点,这里是代码:
label <- 0
df$label <- label
# LOOP through the label column and increment the label
# whenever a new type is found
for (i in 2:length(df$type)) {
if (df$type[i-1] != df$type[i]) { label <- label + 1 }
df$label[i] <- label
}
我的问题
没有循环和条件,任何人都可以做到这一点吗?