Как объединить (объединить) фреймы данных (внутренний, внешний, левый, правый)

Вот несколько версий файлов, основанных на ответе Ивана Баева.

HTML

<input type="file" multiple id="gallery-photo-add">
<div class="gallery"></div>

JavaScript / jQuery

$(function() {
    // Multiple images preview in browser
    var imagesPreview = function(input, placeToInsertImagePreview) {

        if (input.files) {
            var filesAmount = input.files.length;

            for (i = 0; i < filesAmount; i++) {
                var reader = new FileReader();

                reader.onload = function(event) {
                    $($.parseHTML('<img>')).attr('src', event.target.result).appendTo(placeToInsertImagePreview);
                }

                reader.readAsDataURL(input.files[i]);
            }
        }

    };

    $('#gallery-photo-add').on('change', function() {
        imagesPreview(this, 'div.gallery');
    });
});

Требуется jQuery 1.8 из-за использования $ .parseHTML, который должен помочь в смягчении XSS.

Это будет работать из коробки, и вам потребуется только одна из jQuery.

1100
задан NelsonGon 29 March 2019 в 17:14
поделиться

3 ответа

Используя функцию merge и ее необязательные параметры:

Внутреннее соединение: merge (df1, df2) будет работать для этих примеров, потому что R автоматически соединяет фреймы по общим именам переменных, но вы, скорее всего, захотите указать merge (df1, df2, by = "CustomerId") , чтобы убедиться, что вы соответствуете только нужным полям. Вы также можете использовать параметры by.x и by.y , если совпадающие переменные имеют разные имена в разных фреймах данных.

Внешнее соединение: merge (x = df1, y = df2, by = "CustomerId", all = TRUE)

Левый внешний: объединить (x = df1, y = df2, by = "CustomerId", all.x = TRUE)

Правый внешний: объединить (x = df1, y = df2, by = "CustomerId", все. y = TRUE)

Перекрестное соединение: merge (x = df1, y = df2, by = NULL)

Как и в случае с внутренним соединением, вы, вероятно, захотите явно передать "CustomerId" в R как соответствующая переменная. Я думаю, что почти всегда лучше явно указывать идентификаторы, которые вы хотите объединить; безопаснее, если входные данные data.frames неожиданно изменятся, и их будет легче читать позже.

Вы можете объединить несколько столбцов, задав вектор by , например by = c ("CustomerId" , "OrderId") .

Если имена столбцов для объединения не совпадают, можно указать, например, by.x = "CustomerId_in_df1", by.y = "CustomerId_in_df2" , где CustomerId_in_df1 - имя столбца в первом фрейме данных, а CustomerId_in_df2 - имя столбца во втором фрейме данных. (Это также могут быть векторы, если вам нужно объединить несколько столбцов.)

1265
ответ дан 19 December 2019 в 20:14
поделиться

Есть несколько хороших примеров этого в R Wiki . Я украду пару здесь:

Метод слияния

Поскольку ваши ключи названы одинаково, короткий способ выполнить внутреннее соединение - merge ():

merge(df1,df2)

полное внутреннее соединение (все записи из обеих таблиц) можно создать с помощью ключевого слова "all":

merge(df1,df2, all=TRUE)

левое внешнее соединение df1 и df2:

merge(df1,df2, all.x=TRUE)

правое внешнее соединение df1 и df2:

merge(df1,df2, all.y=TRUE)

вы можете переворачивать их, шлепать и тереть вниз, чтобы получить два других внешних соединения, о которых вы спрашивали:)

Метод нижнего индекса

Левое внешнее соединение с df1 слева с использованием метода нижнего индекса будет выглядеть следующим образом:

df1[,"State"]<-df2[df1[ ,"Product"], "State"]

Другая комбинация внешних объединений может быть создана с помощью приглушение левого нижнего индекса внешнего соединения. (да, я знаю, что это то же самое, что сказать: «Я оставлю это в качестве упражнения для читателя ...

79
ответ дан 19 December 2019 в 20:14
поделиться

Я бы порекомендовал проверить пакет sqldf Габора Гротендика , который позволяет вам выражать эти операции в SQL.

library(sqldf)

## inner join
df3 <- sqldf("SELECT CustomerId, Product, State 
              FROM df1
              JOIN df2 USING(CustomerID)")

## left join (substitute 'right' for right join)
df4 <- sqldf("SELECT CustomerId, Product, State 
              FROM df1
              LEFT JOIN df2 USING(CustomerID)")

Я считаю синтаксис SQL более простым и естественным чем его эквивалент в R (но это может отражать мою склонность к РСУБД).

См. sqldf GitHub Габора для получения дополнительной информации о соединениях.

209
ответ дан 19 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: