我遇到一个有关“下标超出范围”的问题,我想要的是获得每个观察值的第一个月和上个月,其中我有三个连续的“1”或“True”。我想创建2个新列“begin”和“end”,分别从第一个月和最后一个月开始。
在我的第一个观察示例中:开始等于avril,结束等于juin
在5观察中:开始等于fevrier,结束等于avril
在9观察中:开始等于janvier,结束等于火星
...

我试图这样做:

nom <- letters[1:5]
pseudo <- paste(name, 21:25, sep = "")
janvier <- c(0, 1, 1, 1, 0)
fevrier <- c(1, 1, 1, 1, 1)
mars <- c(0, 0, 0, 1, 1)
avril <- c(1, 1, 1, 0, 1)
mai <- c(1, 0, 1, 1, 1)
juin <- c(1, 1, 0, 1, 0)

df <- data.frame(nom =nom, pseudo = pseudo, janvier = janvier,
                 fevrier = fevrier, mars = mars, avril = avril,
                 mai = mai, juin = juin)

dfm <- as.matrix(df[, -c(1, 2)])

my_matrix <- matrix(nrow = 10, ncol = 6)


for(i in 1:dim(dfm)[1]){
  for(j in 1:dim(dfm)[2]){
    if(dfm[i, j] + dfm[i, j+1] + dfm[i, j+2] == 3){
      my_matrix[i, j] <- "periode_ok"
      my_matrix[i, j+1] <- "periode_ok"
      my_matrix[i, j+2] <- "periode_ok"
    }
  }
}

输出应该是这样的:
begin <- c("avril", "no  info", "no info",
           "janvier", "fevrier", "avril", "no info",
           "no info", "janvier", "fevrier")
end <- c("juin", "no info", "no info", "mars",
         "avril", "juin", "no info", "no info",
         "mars", "avril")

output <- data.frame(nom =nom, pseudo = pseudo, janvier = janvier,
                 fevrier = fevrier, mars = mars, avril = avril,
                 mai = mai, juin = juin, begin = begin,end = end)

任何帮助将不胜感激

最佳答案

首先,像1:dim(dfm)[1]这样的构造很危险,因为如果dim(dfm)[1]为零,您将获得完全有效的向量1:0,并且循环将尝试寻址向量的零元素,或者在这种情况下,矩阵的地址为零。这是非法的,并且会引发错误。推荐的解决方案是使用seq_len(...)
其次,我使用dim(dfm)[.]nrow代替ncol
现在,对于您遇到的错误。您正在尝试解决j + 1j + 2列,因此,当j达到ncol(dfm)时,您就没有联系了。下面的代码删除了循环限制的最后两个元素。

n <- ncol(dfm)
for(i in seq_len(nrow(dfm))){
  for(j in seq_len(n)[-c(n - 1, n)]){
    if(dfm[i, j] + dfm[i, j+1] + dfm[i, j+2] == 3){
      my_matrix[i, j] <- "periode_ok"
      my_matrix[i, j+1] <- "periode_ok"
      my_matrix[i, j+2] <- "periode_ok"
    }
  }
}

my_matrix

10-06 14:59