es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo aplicar una función compleja a cada fila de un archivo .csv en MATLAB?

Me gustaría aplicar un código externo con una función específica (chaos; https://figshare.com/s/80891dfb34c6ee9c8b34) de un artículo de Toker et al. 2020 (https://www.nature.com/articles/s42003-019-0715-9#Sec1) para probar si mis datos son estocásticos o caóticos.

He intentado usar bucles, for, cellfun, pero ninguno de ellos funciona en este caso.

Cuando intenté utilizar el siguiente código:

T = readtable('ibfrq3.csv');
C = table2array(T);
D = num2cell(C, 2);
rowSums = cellfun(@sum, D)
chaos = cellfun(@chaos, D)

Recibí tres errores:

No se puede realizar la asignación porque el tamaño del lado izquierdo es 1 por 14 y el tamaño del lado derecho es 1 por 3.

Error en chaos>surrogate (línea 989)
        surr(k,:)=unwrap(horzcat(st,parts{randperm(j)},en));

Error en chaos (línea 157)
            [surr, params] = surrogate(zscore(surr), numsurr, 'CPP', 1, 1); 

Curiosamente, puedo hacer que la función funcione, pero solo para filas separadas (copiándolas entre corchetes y etiquetándolas como y, por ejemplo y = [1,2,3,4,5,6,7,8,9,5,6,7,8,8]).

Mi resultado deseado es una cadena de texto (o idealmente una columna agregada a mi archivo .csv) con las salidas de la función chaos (una palabra por fila: ‘estocástico’ o ‘caótico’, dependiendo del resultado).

Mis datos están disponibles aquí: https://drive.google.com/file/d/1I2BChrv0iqNr1dcEKTQKxKF7DDl_hF23/view?usp=sharing
El archivo .csv consta de frecuencias alélicas en diferentes períodos de tiempo.

EDIT:
Intentando

numRows = size(C, 1);
for row = 1:numRows
    result(row) = chaos(C(row,:));
end

Obtuve errores similares a los mencionados anteriormente.

También intenté ejecutar el código fila por fila en mis datos para verificar qué fila causa problemas utilizando

row1 = C(1,:);
chaos(row1)

para cada fila. Curiosamente, funciona perfectamente y da el resultado deseado para las filas no. 1, 3-9 y 11-100. Las filas no. 2 y no. 10 no son diferentes de las demás y no contienen ningún carácter o valor especial. No tengo idea de qué está mal con ellas.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás enfrentando está relacionado con el formato de entrada de la función chaos. A partir de tus intentos, es evidente que la función solo funciona con filas de datos individuales proporcionadas como arrays separados.

    Una forma de solucionar este problema es hacer un bucle a través de cada fila de tu conjunto de datos de entrada, aplicar la función chaos a esa fila específica y almacenar el resultado en un nuevo array. Aquí tienes un ejemplo de código que puedes modificar para que se ajuste a tus requisitos específicos:

    numRows = size(C, 1);
    result = cell(numRows, 1); % inicializar un array de celdas para almacenar los resultados
    
    for row = 1:numRows
        result{row} = chaos(C(row,:));
    end
    

    Este código debería iterar a través de cada fila del conjunto de datos de entrada, aplicar la función chaos a esa fila y almacenar el resultado en la fila correspondiente del array de celdas result. Una vez que se completa el bucle, puedes escribir el array result en una nueva columna de tu archivo de entrada.

    Si sigues enfrentando problemas con filas específicas que causan errores, puedes intentar depurar esas filas por separado. Una posible razón de los errores podría ser la falta de valores o valores no válidos en esas filas. Puedes intentar verificar el formato y el contenido de esas filas para identificar cualquier problema.

Comments are closed.