Страницы: 1
RSS
PQ значения из одного столбца перенести в три столбца согласно индексу
 
здравствуйте. не допру как сделать :cry:  надо как на скрине, значения из одного столбца развернуть в три столбца согласно индексу. не могли бы показать как это делается. я уже видел, но не знаю как гуглить. вернее, что гуглить.
 
ну так, поигрался, только кнопками:
Код
// Таблица1 (2)
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"значение Y", Int64.Type}, {"Столбец1", Int64.Type}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Индекс0", 0, 1),
    #"Added Index1" = Table.AddIndexColumn(#"Added Index", "Индекс1", 1, 1),
    #"Merged Queries" = Table.NestedJoin(#"Added Index1",{"Индекс0"},#"Added Index1",{"Индекс1"},"Added Index1",JoinKind.LeftOuter),
    #"Expanded {0}" = Table.ExpandTableColumn(#"Merged Queries", "Added Index1", {"Столбец1"}, {"Столбец1.1"}),
    #"Added Conditional Column" = Table.AddColumn(#"Expanded {0}", "Custom", each if [Столбец1.1] = null then [Индекс1] else if [Столбец1.1] >= [Столбец1] then [Индекс1] else null),
    #"Sorted Rows" = Table.Sort(#"Added Conditional Column",{{"Индекс0", Order.Ascending}}),
    #"Filled Down" = Table.FillDown(#"Sorted Rows",{"Custom"}),
    #"Removed Other Columns" = Table.SelectColumns(#"Filled Down",{"значение Y", "Столбец1", "Custom"}),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Removed Other Columns", {{"Столбец1", type text}}, "ru-RU"), List.Distinct(Table.TransformColumnTypes(#"Removed Other Columns", {{"Столбец1", type text}}, "ru-RU")[Столбец1]), "Столбец1", "значение Y"),
    #"Removed Columns" = Table.RemoveColumns(#"Pivoted Column",{"Custom"})
in
    #"Removed Columns"
F1 творит чудеса
 
Доброе время суток.
Ещё вариант. Думаю, можно и кнопками.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    addId = Table.AddIndexColumn(Source, "id", 100),
    defineRow = Table.AddColumn(addId, "row", each [id] - [Столбец1]),
    removeId = Table.RemoveColumns(defineRow, {"id"}),
    pivoted = Table.Pivot(Table.TransformColumnTypes(removeId, {{"Столбец1", type text}}, "ru-RU"), List.Distinct(Table.TransformColumnTypes(removeId, {{"Столбец1", type text}}, "ru-RU")[Столбец1]), "Столбец1", "значение Y"),
    removeRow = Table.RemoveColumns(pivoted, {"row"})
in
    removeRow
 
Андрей VG, супер, отличный прием. Кнопками 100% повторяется, просто можно вставлять индекс от 1 и всё.
F1 творит чудеса
 
Максим Зеленский, Андрей VG, спасибо за Ваши решения. как еще вариант, можно, при возможности, сразу столбец с нужным индексом добавить  
 
Цитата
artyrH написал:
сразу столбец с нужным индексом добавить  
Можно, именно это и сделано в предложенном варианте ;)
 
Еще вариант
Код
let
    Src = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    a = Src[значение Y], b = Src[Столбец1], c = List.Positions(a),
    d = (i)=> (if i=0 then true else b{i-1}>b{i}),
    e = (l,i)=> l&{List.Repeat({null}, b{i}-1)&{a{i}}},
    f = (l,i)=> l&List.Repeat({null}, b{i}-List.Count(l)-1),
    g = (l,i)=> List.RemoveLastN(l)&{f(List.Last(l),i)&{a{i}}},
    h = List.Accumulate(c,{},(l,i)=>if d(i) then e(l,i) else g(l,i)),
    i = Table.FromColumns(List.Zip(h))
in
    i
Изменено: Андрей Лящук - 21.03.2019 17:06:39
 
Андрей Лящук, спасибо
а, может, к каждой строке комментарии добавите
 
Убрал из функции f лишнюю проверку
Код
let
    Src = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    a = Src[значение Y], b = Src[Столбец1],

        //Массив чисел от 0 до кол-во строк таблицы -1
    с = List.Positions(a),

        //i- номер строки в исходной таблице, b - [Столбец1]
        //если i=0 или в i строке столбца Столбец1 значение> чем в i-1 строке, возвращает истину
        //определяет, что в результирующем массиве нужно добавить новый элемент
    d = (i)=>(if i=0 then true else b{i-1}>b{i}), 

        //l - результирующий массив, i - номер строки в исходной таблице, a - [значение Y], b - [Столбец1]
        //если d(i), то в массив l добавляется элемент - массив, состоящий из b{i}-1 null элементов и a{i}    
    e = (l,i)=> l & { List.Repeat({null}, b{i}-1) & {a{i}} },

        //l - массив (последний элемент результирующего массива), i - номер строки в исходной таблице, b - [Столбец1]
        //если количество элементов массива < b{i}-1, добавяляет в массив l недостающее количество null элементов 
    f = (l,i)=> l & List.Repeat({null}, b{i}-List.Count(l)-1), 

        //l - результирующий массив, i - номер строки в исходной таблице, a - [значение Y]
        //если not d(i), то в последний элемент массива l добавляет недостающее до b{i} количество null элементов и a{i}
    g = (l,i)=>List.RemoveLastN(l) & { f(List.Last(l),i) & {a{i}} },   

        //собирает данные из массивов a и b, используюя массив c в качестве итератора
    h = List.Accumulate(c,{},(l,i)=>if d(i) then e(l,i) else g(l,i)),
    i = Table.FromColumns(List.Zip(h))
in
    i
 
artyrH, это алгоритм добивания таблицы пропущенными строками. Но на большом массиве подозреваю что такая конструкция будет по-медленнее работать чем варианты от Андрея и Максима.
Вот горшок пустой, он предмет простой...
 
Цитата
Андрей Лящук написал: Еще вариант
Мне это чем-то напомнило https://www.ioccc.org  :)
Код
char O,o[];main(l){for(;~l;O||puts(o))O=(O[o]=
~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;}

Ну или вот:
Цитата
В 2004 году победителем конкурса стала графическая многозадачная операционная система с поддержкой клавиатуры, мыши, примитивной оконной подсистемой, поддержкой файловой системы, возможностью запускать ELF-программы. В поставку системы входит просмотрщик текстовых файлов, а также рудиментарный командный интерпретатор. Исходный код системы вместе с приложениями имеет размер около 3,5 килобайт.
http://www0.us.ioccc.org/2004/gavin.c
Изменено: Alexey_Spb - 21.03.2019 23:32:47
 
Цитата
PooHkrd написал: такая конструкция будет по-медленнее работать
PooHkrd
, мне хотя б понять о чем там речь. а так мне сподручнее формулами индекс проставлять. например, в этой теме как обойтись без формул.
 
artyrH, а исходные данные вы откуда берете?
 
Андрей Лящук, ссылка на слове "этой"
 
artyrH, не приметил, там 2 ссылки в  1 слепились

Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content][[Массив1]],
    #"Добавлен индекс" = Table.AddIndexColumn(Источник, "Индекс", 0, 1),
    #"Строки с примененным фильтром" = Table.SelectRows(#"Добавлен индекс", each Text.Contains([Массив1], ":") or Text.Contains([Массив1], "Завершен")),
    #"Добавлен индекс1" = Table.AddIndexColumn(#"Строки с примененным фильтром", "Индекс.1", 0, 1),
    Пользовательская1 = List.RemoveFirstN(#"Добавлен индекс1"[Индекс],1)&{List.Last(#"Добавлен индекс"[Индекс])+1},
    Пользовательская2 = Table.FromRecords(
        Table.TransformRows(
            #"Добавлен индекс1",
            each let 
                record=_ 
            in 
                Record.TransformFields(
                    record,
                    {
                        {
                            "Индекс" , 
                            each let 
                                i = _,
                                j = {0..Пользовательская1{record[Индекс.1]}-1-i},
                                k = List.Transform(j, each if List.Count(j)=4 and _>0 then _+3 else _)
                            in k
                        }
                    }
                )
        )
    )[[Индекс],[Индекс.1]],
    #"Развернутый элемент Индекс" = Table.ExpandListColumn(Пользовательская2, "Индекс"),
    Пользовательская3 = Table.FromColumns({Источник[Массив1]}&Table.ToColumns(#"Развернутый элемент Индекс")),
    #"Сведенный столбец" = Table.Pivot(Table.TransformColumnTypes(Пользовательская3, {{"Column2", type text}}, "ru-RU"), List.Sort(List.Distinct(Table.TransformColumnTypes(Пользовательская3, {{"Column2", type text}}, "ru-RU")[Column2])), "Column2", "Column1"),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Сведенный столбец",{"Column3"})
in
    #"Удаленные столбцы"
Страницы: 1
Наверх