Попытка создать один столбец 0/1 из одного столбца с несколькими значениями для каждой записи - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть данные о проблемах, которые произошли в производственной среде.Существует столбец с именем Теги, в котором в настоящее время есть несколько строк для каждой записи.Я имею в виду отдельные столбцы 0/1 для каждого уникального тега, которые позволят пользователям взглянуть на определенный тип проблем, но я изо всех сил пытаюсь это сделать.Я использовал Tableau Prep для подготовки данных до того, как столкнулся с этой проблемой.Любое руководство о том, как это сделать в Tableau Prep или Excel, будет очень кстати.Большое вам спасибо

Например, от этого

<S.No.>         Tags
Incident 1     "arms";"hands";"eyes";
Incident 2     "head";"hands";"arms";
Incident 3     "ear";"eyes";
Incident 4     "hair";

На это:

<S.No.>         isArms   isHands     isEyes   isHead  isEar  isHair
Incident 1       Yes     Yes         Yes      No      No     No
Incident 2       Yes     Yes         No       Yes     No     No
Incident 3       No      No          Yes      No      Yes    No
Incident 4       No      No          No       No      No     Yes

1 Ответ

0 голосов
/ 28 ноября 2018

Не очень красиво, и я с нетерпением жду возможности увидеть гораздо более элегантные и профессиональные решения, чтобы поучиться у них, но это работает быстро и грязно (при условии, что ваши данные находятся в столбцах A и B).

Sub CleanData()

    Dim objDict As Object
    Dim arr As Variant
    Dim cll As Range
    Dim lng As Long
    Dim str As String
    Dim lRow As Long, lCol As Long

    Set objDict = CreateObject("System.Collections.ArrayList")


    For Each cll In Range("B2", Range("B" & Rows.Count).End(xlUp))
        str = Replace(Left(cll.Value, Len(cll.Value) - 1), """", "")
        arr = Split(str, ";")
        For lng = LBound(arr) To UBound(arr)
            If Not objDict.Contains(CStr(arr(lng))) Then objDict.Add CStr(arr(lng))
        Next
    Next

    Range("C1").Resize(, objDict.Count) = objDict.toarray()

    With ActiveSheet
        lCol = .UsedRange.Columns(.UsedRange.Columns.Count).Column
        lRow = .UsedRange.Rows(.UsedRange.Rows.Count).Row
    End With

    Range(Range("C2"), Cells(lRow, lCol)).Formula = "=IF(ISNUMBER(FIND(C$1,$B2)),1,0)"
    Range(Range("C2"), Cells(lRow, lCol)).Value = Range(Range("C2"), Cells(lRow, lCol)).Value

    For lng = 3 To lCol
        Cells(1, lng).Value = "is" & Application.Proper(Cells(1, lng))
    Next

    Columns(2).Delete

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...