按R中的群集分配id
我有一个像这样的向量按R中的群集分配id,r,R,我有一个像这样的向量 var1=c("A","A","B"," "," ","C","A","","A") 如何创建一个ID向量来指示它们是否相邻。像 id1=c(1,1,1,0,0,2,2,0,3) 所以我想给每个集群分配ID。在R中有什么方法可以做到这一点吗?这里有一个使用rle的选项。我们使用trimws删除前导/滞后空间,根据是否为非空字符串将其转换为逻辑向量(nzchar),并获得运行长度编码(rle)。更改“rl”的列表中的“值”向量,该向量符合序列,并使用长度复制值 rl &l
var1=c("A","A","B"," "," ","C","A","","A")
如何创建一个ID向量来指示它们是否相邻。像
id1=c(1,1,1,0,0,2,2,0,3)
所以我想给每个集群分配ID。在R中有什么方法可以做到这一点吗?这里有一个使用
rle
的选项。我们使用trimws
删除前导/滞后空间,根据是否为非空字符串将其转换为逻辑向量(nzchar
),并获得运行长度编码(rle
)。更改“rl”的列表
中的“值”向量,该向量符合序列,并使用长度复制值
rl <- rle(nzchar(trimws(var1)))
rl$values[rl$values] <- seq_along(rl$values[rl$values])
rep(rl$values, rl$lengths)
#[1] 1 1 1 0 0 2 2 0 3
这里有一个带有rle
的选项。我们使用trimws
删除前导/滞后空间,根据是否为非空字符串将其转换为逻辑向量(nzchar
),并获得运行长度编码(rle
)。更改“rl”的列表
中的“值”向量,该向量符合序列,并使用长度复制值
rl <- rle(nzchar(trimws(var1)))
rl$values[rl$values] <- seq_along(rl$values[rl$values])
rep(rl$values, rl$lengths)
#[1] 1 1 1 0 0 2 2 0 3
我们可以在var1
的diff
上cumsum
生成表示包含空字符串的集群的序列,然后用0
替换空字符串位置:
replace(cumsum(c(T, diff(var1 != "") == 1)), var1 == "", 0)
给出:
# [1] 1 1 1 0 0 2 2 0 3
# [1] 0 1 1 1 0 0 2 2 0 3
用于:
这假设var1
不是以空字符串开头的,为了将其推广到这种情况,我们可以检查var1
的第一个元素,并使用条件作为初始值:
replace(cumsum(c(var1[1] != "", diff(var1 != "") == 1)), var1 == "", 0)
给出:
# [1] 1 1 1 0 0 2 2 0 3
# [1] 0 1 1 1 0 0 2 2 0 3
用于:
我们可以在var1
的diff
上cumsum
生成表示包含空字符串的集群的序列,然后用0
替换空字符串位置:
replace(cumsum(c(T, diff(var1 != "") == 1)), var1 == "", 0)
给出:
# [1] 1 1 1 0 0 2 2 0 3
# [1] 0 1 1 1 0 0 2 2 0 3
用于:
这假设var1
不是以空字符串开头的,为了将其推广到这种情况,我们可以检查var1
的第一个元素,并使用条件作为初始值:
replace(cumsum(c(var1[1] != "", diff(var1 != "") == 1)), var1 == "", 0)
给出:
# [1] 1 1 1 0 0 2 2 0 3
# [1] 0 1 1 1 0 0 2 2 0 3
用于: