2016-08-15 21 views
1

У меня есть две таблицы, которые выглядят так: Я знаю, если я начну с Spreadsheet2, я могу просто vlookup и получить значения. Но мне нужно начать с Spreadsheet1. Мне нужно добавить строки. Это небольшие данные, но то, что у меня на самом деле, огромно .. (более 20000 строк).Excel vlookup несколько значений и добавить повторяющиеся строки

Spreadsheet1:

Category Type NumItem 
Air   B747 10 
Ground  TBus1 15 
Air   B777 20 
Air   A380 5 

Spreadsheet2:

Type TypeElement NumEngine 
B747 747T1   2 
B747 747T2   4 
B747 747T3   8 
Tbus1 TbusT1   0 
B777 777T1   6 
B777 777T2   4 
A380 380T1   10 

Я хочу, чтобы объединить их в электронную таблицу. Поскольку вы можете видеть Type для обоих совпадений, но для каждого типа у меня есть несколько «TypeElement».

Я хочу, чтобы выглядеть как

Category Type NumItem TypeElement NumEngine 
Air   B747 10   747T1   2 
Air   B747 10   747T2   4 
Air   B747 10   747T3   8 
Ground  TBus1 15   TbusT1   0 
Air   B777 20   777T1   6 
Air   B777 20   777T2   4 
Air   A380 5   380T1   10 

Можно ли это сделать с помощью функции в Excel или .. я должен использовать VBA/Macro? Если кто-нибудь знает, как это можно сделать с помощью R, прокомментируйте, какие формулы/пакеты я должен использовать.

спасибо !!

+2

Есть несколько библиотек, которые можно импортировать/экспортировать из Excel: openxlsx, XLConnect. Используйте их для чтения обеих таблиц в двух кадрах данных, а затем используйте 'merge' –

+0

. Причина, по которой я должен начать с Таблицы 1, состоит в том, что мне нужно выяснить, какие элементы в Spreadsheet1 не имеют соответствующих данных в Spreadsheet2. Например, если в таблице 1 есть B700, Spreadsheet2 не имеет каких-либо данных, которые я могу найти в ячейках пустой/ошибки. –

+0

Вам не нужно использовать таблицу для этого (и если у вас есть 20k строк, вы не хотите).Импортируйте в R с помощью 'readxl' или вашего любимого пакета, затем используйте' merge' (здесь с 'all = TRUE'), или если это запутывает, функции' * _join' пакета dplyr (здесь 'full_join'), которые SQL-стиль. Также обратите внимание, что у вас есть несоответствия между 'TBus1' и' Tbus1', поэтому вы можете взять все 'toupper' или' tolower'. – alistaire

ответ

2

Как упоминалось в @ r-schifini, есть несколько библиотек, которые можно использовать для импорта файлов Excel. Здесь я использую пакет readxl. Чтобы сохранить все строки из первой таблицы - ваш Spreadsheet1 - укажите all.x=TRUE в функции merge. См. ?merge для более подробной информации. Обратите внимание, что я добавил еще одну строку в Spreadsheet1 с поддельными данными для типа B700.

library(readxl) 
ss1 <- read_excel(path = "spreadsheet1.xlsx", sheet = 1) 
ss2 <- read_excel(path = "spreadsheet2.xlsx", sheet = 1) 


out <- merge(ss1, ss2, all.x=TRUE) 
out 
# Type Category NumItem TypeElement NumEngine 
# 1 A380  Air  5  380T1  10 
# 2 B700  Air  8  <NA>  NA 
# 3 B747  Air  10  747T1   2 
# 4 B747  Air  10  747T2   4 
# 5 B747  Air  10  747T3   8 
# 6 B777  Air  20  777T1   6 
# 7 B777  Air  20  777T2   4 
# 8 TBus1 Ground  15  <NA>  NA 

Почему у нас есть NA s в строке 8? Это потому, что ваш тип TBus1 в Таблице1 и Tbus1 в Таблице2. Чтобы обойти такие проблемы, мы можем изменить случай на верхний, прежде чем мы начнем слияние.

ss1$Type <- toupper(ss1$Type) 
ss2$Type <- toupper(ss2$Type) 
out <- merge(ss1, ss2, all.x=TRUE) 
out 
# Type Category NumItem TypeElement NumEngine 
# 1 A380  Air  5  380T1  10 
# 2 B700  Air  8  <NA>  NA 
# 3 B747  Air  10  747T1   2 
# 4 B747  Air  10  747T2   4 
# 5 B747  Air  10  747T3   8 
# 6 B777  Air  20  777T1   6 
# 7 B777  Air  20  777T2   4 
# 8 TBUS1 Ground  15  TbusT1   0 
0

Некоторые идеи 1) вы можете попробовать комбинировать строки и использовать функцию сортировки, сортируя значения по возрастанию или убыванию значений в элементе элемента. Например, сделайте собственный сортировку или фильтр.

2) вам нужно выбрать, как вы хотите классифицировать значения. По категории? По типу? Вы можете сгруппировать элементы изначально. Установить связи между переменными.

0

Я использую VBA двигая TB1 и TB2 в файл Access (с: \ testdb.mdb). Затем с помощью SQL команды, чтобы присоединиться к ним


Sub Main() 
    Dim adoxCat As Object, adoConn As Object, adoRst As Object, var As Variant, strSQL As String 
    Dim i As Long 

'make an empty mdb file' 
    If Dir("C:\testdb.mdb") = "" Then 
     Set adoxCat = CreateObject("ADOX.catalog") 
     adoxCat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\testdb.mdb;" 
     Set adoxCat = Nothing 
    Else 
     MsgBox "C:\testdb.mdb is existed.", vbCritical 
     Exit Sub 
    End If 
'create an ADO connection' 
    On Error Resume Next 
    Set adoConn = CreateObject("adodb.connection") 
    With adoConn 
     .Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\testdb.mdb;" 
     If .State 1 Then 
      MsgBox "Cannot create ADO Connection.", vbCritical 
      Set adoConn = Nothing 
      Exit Sub 
     End If 
    End With 
'create two Tables in the mdb file.' 
    With adoConn 
     .Execute "CREATE TABLE tb_1 (Category varchar, Type varchar, NumItem number)" 
     .Execute "CREATE TABLE tb_2 (Type varchar, TypeElement varchar, NumEngine number)" 

'move data in excel to mdb file' 
     var = toArray(Worksheets(1)) 
     For i = LBound(var, 1) To UBound(var, 1) 
      strSQL = "INSERT INTO tb_1 (category, type, NumItem) VALUES(" 
      strSQL = strSQL & " '" & var(i, 0) & "'," 
      strSQL = strSQL & " '" & var(i, 1) & "'," 
      strSQL = strSQL & " " & var(i, 2) & ");" 
      .Execute strSQL 
     Next i 

     var = toArray(Worksheets(2)) 
     For i = LBound(var, 1) To UBound(var, 1) 
      strSQL = "INSERT INTO tb_2 (Type, TypeElement, NumEngine) VALUES(" 
      strSQL = strSQL & " '" & var(i, 0) & "'," 
      strSQL = strSQL & " '" & var(i, 1) & "'," 
      strSQL = strSQL & " " & var(i, 2) & ");" 
      .Execute strSQL 
     Next i 

'Use SQL Join statement to Join two tables' 
     strSQL = "SELECT * FROM tb_1 left join tb_2 on tb_1.type = tb_2.type;" 
     Set adoRst = .Execute(strSQL) 
'output the result to excel worksheet(3)' 
     Worksheets(3).Range("A1").CopyFromRecordset adoRst 

     .Close 
    End With 
    Set adoConn = Nothing 
'remove the mdb file' 
    Kill "c:\testdb.mdb" 
End Sub 


Function toArray(from_WSht As Worksheet) As Variant 
    Dim strPath As String, myRng As Range, rw As Range, c As Range 
    Dim i As Long, j As Long, dt As Variant 

    Set myRng = from_WSht.Range("a1").CurrentRegion 
    If not myRng.Rows.Count > 1 Then GoTo errHdr 
     ReDim dt(myRng.Rows.Count - 1, myRng.Columns.Count - 1) As Variant 
     i = 0 
     For Each rw In myRng.Rows 
      If rw.Row > 1 Then 
       j = 0 
       For Each c In rw.Cells 
        dt(i, j) = c.Value 
        j = j + 1 
       Next c 
       i = i + 1 
      End If 
     Next rw 

    toArray = dt 
    Exit Function 
errHdr: 
    toArray = 0 
End Function 

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^