Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按R中的群集分配id_R - Fatal编程技术网

按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
用于: