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?
2 respuestas
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
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
Nuevas preguntas
r
R es un entorno de software y lenguaje de programación de código abierto y gratuito para computación estadística, bioinformática, visualización y computación en general. Proporcione ejemplos mínimos y reproducibles junto con el resultado deseado. Use dput () para los datos y especifique todos los paquetes no base con llamadas a library (). No incruste imágenes para datos o código, use bloques de código con sangría en su lugar. Para preguntas relacionadas con estadísticas, use https://stats.stackexchange.com.