gpt4 book ai didi

r - 如何根据聚集的人口找到指数

转载 作者:行者123 更新时间:2023-12-04 12:17:53 26 4
gpt4 key购买 nike

数据集有一些聚集组的模式。这是数据集:

index <- c(1:30)
a <- c(0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,0,1,1,1,1,0,0,1,0,1,1,1,0,1,0)
b <- c(1,1,1,0,0,1,1,1,0,0,1,1,1,1,0,0,1,1,1,0,0,0,0,0,1,0,1,1,1,1)
c <- c(1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
d <- c(0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,1,0,1,1,1)
df <- data.frame(cbind(index, a, b, c, d))

一般情况下,任务是当数据列(即a、b、c、d)中至少显示三个连续值(即1)时,识别索引(即“index”列)列及其相邻列显示至少三个连续值(即 1)。

例如,下例的结果将输出 2、3、4、7、8、9。请参见突出显示的连续值。

索引 1 2 3 4 5 6 7 8 9

col-a 0 0 0 0 0 1 1 0 1

col-b 1 0 1 0 1 1 1 1 1

col-c 0 1 1 1 0 0 1 1 1

col-d 1 1 1 1 0 0 0 0 0

结果应输出索引:1, 2, 3, 6, 7, 8, 12, 13, 14, 17, 18, 19, 27。

最佳答案

这不是最可扩展的解决方案,但它返回了所需的结果

# convert 1s that do not have at least runs of length 3 to 0
df[LETTERS[1:4]] <- lapply(df[-1], function(x) {
tmp <- rle(x)
tmp$values[tmp$lengths < 3] <- 0L
inverse.rle(tmp)})

# add neighbor columns use logical subsetting to return the relevant indices
df$index[(pmax(df[[LETTERS[1]]] + df[[LETTERS[2]]],
df[[LETTERS[2]]] + df[[LETTERS[3]]],
df[[LETTERS[3]]] + df[[LETTERS[4]]]) > 1)]
[1] 1 2 3 6 7 8 12 13 14 17 18 19 27

这是一个可扩展到 n 列的版本。

# convert 1s that do not have at least runs of length 3 to 0, put into list
l <- lapply(df[-1], function(x) {
tmp <- rle(x)
tmp$values[tmp$lengths < 3] <- 0L
inverse.rle(tmp)})

同上,只是存储在一个新的对象中,为了方便。现在,使用 Map 返回相邻列之和的列表。使用 do.callpmax 返回元素级最大值。

df$index[do.call(pmax, Map(function(x, y) l[[x]] + l[[y]],
head(seq_along(l), -1), tail(seq_along(l), -1))) > 1]

关于r - 如何根据聚集的人口找到指数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47337909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com