df_reorder_columns Subroutine

public subroutine df_reorder_columns(df, new_order)

Reorder columns in the data frame

Rearranges columns according to the specified order

@param[in,out] df The data frame to modify @param[in] new_order Array specifying the new column order (permutation of 1:ncols)

Arguments

Type IntentOptional Attributes Name
type(data_frame), intent(inout) :: df
integer, intent(in), dimension(:) :: new_order

Source Code

    subroutine df_reorder_columns(df, new_order)
        type(data_frame), intent(inout) :: df
        integer, dimension(:), intent(in) :: new_order

        integer :: i
        type(data_frame) :: temp_df

        if (size(new_order) /= df % ncols()) error stop "new_order size must equal number of columns"

        ! Validate indices
        do i = 1, size(new_order)
            if (new_order(i) < 1 .or. new_order(i) > df % ncols()) error stop "invalid column index in new_order"
        end do

        ! Create new data frame with reordered columns
        call temp_df % new(df % get_max_char_len())

        do i = 1, df % ncols()
            select case (df % dtype(new_order(i)))
            case (REAL_NUM)
                if (df % get_with_headers()) then
                    call df_append_real(temp_df, df_get_col_real(df, new_order(i)), df % header(new_order(i)))
                else
                    call df_append_real(temp_df, df_get_col_real(df, new_order(i)))
                end if
            case (INTEGER_NUM)
                if (df % get_with_headers()) then
                    call df_append_integer(temp_df, df_get_col_integer(df, new_order(i)), df % header(new_order(i)))
                else
                    call df_append_integer(temp_df, df_get_col_integer(df, new_order(i)))
                end if
            case (LOGICAL_NUM)
                if (df % get_with_headers()) then
                    call df_append_logical(temp_df, df_get_col_logical(df, new_order(i)), df % header(new_order(i)))
                else
                    call df_append_logical(temp_df, df_get_col_logical(df, new_order(i)))
                end if
            case (CHARACTER_NUM)
                if (df % get_with_headers()) then
                    call df_append_character(temp_df, df_get_col_character(df, new_order(i)), df % header(new_order(i)))
                else
                    call df_append_character(temp_df, df_get_col_character(df, new_order(i)))
                end if
            case (COMPLEX_NUM)
                if (df % get_with_headers()) then
                    call df_append_complex(temp_df, df_get_col_complex(df, new_order(i)), df % header(new_order(i)))
                else
                    call df_append_complex(temp_df, df_get_col_complex(df, new_order(i)))
                end if
            end select
        end do

        ! Destroy original and move temp_df data to df
        call df % destroy()
        df = temp_df
    end subroutine df_reorder_columns