Tengo problemas para indexar una función correctamente para que devuelva los valores correctos. La función solo se aplica cuando se cumple una condición if y la instrucción ifelse está en un bucle for.

He simplificado mi función y conjunto de datos para hacer que el ejemplo sea reproducible aquí: la forma en que lo escribí actualmente no es muy eficiente, pero solo quiero asegurarme de que la indexación funcione para que pueda intentar aplicar esto de nuevo a mi conjunto de datos más complicado, luego trabaje en la optimización más adelante.

Primero empiezo con algunos datos:

var1 <- seq(100, 500, 100)
matrix1 <- matrix(1:12, ncol=2)
matrix2 <- matrix(c(1,2,5,6,8,9,11,12,14,15,17,20), ncol=2)
matrix3 <- matrix(seq(1,34,3), ncol=2)
list1 <- list(matrix1, matrix2, matrix3)

Tengo una función que toma un marco de datos como a continuación:

func1 <- function(df1) {
  data1 <- df1[,1]
  data2 <- df1[,2]
  data3 <- vector()
  data3[i] <- sum(data1, data2)
  return(data3)
}

Y mi bucle for se ve a continuación:

for (i in (1:3)) {
  vec1 <- var1
  vec2 <- diff(unlist(list1[[i]])[,1])
  df1 <- matrix()
  df1 <- cbind(vec1, vec2)
  len <- length(which(vec2<3))
  if (len>1) {
    func1(df1)
  }
  else data3 <- NA
  print(data3)
}

Estoy tratando de aplicar solo func1 si mi df1 pasa la prueba length, y si no cumple con el requisito de longitud, quiero darle un NA valor.

Cuando i=1, len=5 y data3=1505; cuando i=2, len=4 y data3=1508; cuando i=3, len=0 así que data3=NA. En resumen, el resultado que quiero devolver del bucle for es data3 = c(1505, 1508, NA).

Sin embargo, no puedo obtener ese resultado ahora, y dado que la ejecución individual para i=1 i=2 y i=3 funciona, sospecho que tengo un problema con el índice (probablemente dentro de { {X3}} supongo) pero no puedo entenderlo. ¿Puede alguien darme algunas sugerencias?

0
Jennifer 4 dic. 2019 a las 21:09

2 respuestas

La mejor respuesta

Ajusté un poco la sintaxis del bucle:

data3 <- vector(length = 3, mode = "numeric")
for (i in 1:3) {
  vec1 <- var1
  vec2 <- diff(unlist(list1[[i]])[,1])
  df1 <- matrix()
  df1 <- cbind(vec1, vec2)
  len <- length(which(vec2<3))
  if (len>1) {
    v <- func1(df1)
    v <- v[!is.na(v)] #when i = 2, func1 returns a vector of length 2
    data3[[i]] <- v
  }
  else {
    data3[[i]] <- NA
  }
}

data3
[1] 1505 1508   NA
0
David Ranzolin 4 dic. 2019 a las 20:01

Creo que tenía un error tipográfico en su función func1, que debería ser

func1 <- function(df1) {
  data1 <- df1[,1]
  data2 <- df1[,2]
  data3 <- vector()
  data3 <- sum(data1, data2)
  return(data3)
}


data3 <- c()
for (i in (1:3)) {
  vec1 <- var1
  vec2 <- diff(unlist(list1[[i]])[,1])
  df1 <- matrix()
  df1 <- cbind(vec1, vec2)
  len <- length(which(vec2<3))
  if (len>1) {
    r <- func1(df1)
  }
  else r <- NA
  data3 <- c(data3,r)
}

Después de arreglar eso, obtendrás la salida

> data3
[1] 1505 1508   NA
1
ThomasIsCoding 4 dic. 2019 a las 21:24