Однострочный для объединения двух фреймов данных с отличительным столбцом?

Я часто обнаруживаю, что создаю два похожих фрейма данных, которые я хотел бы rbind объединить, но отслеживаю, из какого фрейма взята каждая строка, с помощью отличительного столбца. Мой типичный мотив был

new_df <- rbind(
  cbind(df1, id="A"),
  cbind(df2, id="B")
)

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

df1$id <- "A"
df2$id <- "B"
new_df <- rbind(df1, df2)

и хотя я знаю, что вы, могу, делаете это однострочным, играя с $<-, это делает его гораздо менее читаемым, чем мотив cbind/rbind выше. Также не гарантируется, что строки будут уникальными, поэтому я не могу использовать классический мотив mutate/ifelse, который я видел в других местах:

# 'value' is not necessarily unique in the below line
new_df <- cbind(df1, df2) %>% mutate(id = ifelse(something==value, "A", "B")

Проблема часто возникает из-за такого процесса, как добавление переменной фасетирования для ggplot — я сделал два фрейма данных из разных процессов, но хотел бы построить их с использованием фасетов, для которых требуется столбец фасетирования.

Каков R-дружественный способ rbind двух фреймов данных при одновременном создании столбца, который отслеживает, из какого фрейма данных они были получены?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
2
0
26
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

С bind_rows может быть проще

library(dplyr)
bind_rows(list(A = df1, B = df2), .id = 'id')

Аккуратный. Я не думал использовать .id так, спасибо!

Dubukay 17.05.2022 19:39

1) Мы можем использовать rbind/Map из базы R вот так. Это может работать с любым количеством фреймов данных, хотя здесь мы показываем только два.

do.call("rbind", Map(data.frame, id = c("A", "B"), list(BOD, 10 * BOD)))

2) Если мы начнем с именованного списка L, то базовый код R будет следующим.

L <- list(A = BOD, B = 10 * BOD)
do.call("rbind", Map(data.frame, id = names(L), L))

давая:

    id Time demand
A.1  A    1    8.3
A.2  A    2   10.3
A.3  A    3   19.0
A.4  A    4   16.0
A.5  A    5   15.6
A.6  A    7   19.8
B.1  B   10   83.0
B.2  B   20  103.0
B.3  B   30  190.0
B.4  B   40  160.0
B.5  B   50  156.0
B.6  B   70  198.0

3) Обратите внимание, что простой rbind помечает строки уникальным указанием их источника, если имена включены, как показано.

rbind(A = BOD, B = 10 * BOD)

давая:

    Time demand
A.1    1    8.3
A.2    2   10.3
A.3    3   19.0
A.4    4   16.0
A.5    5   15.6
A.6    7   19.8
B.1   10   83.0
B.2   20  103.0
B.3   30  190.0
B.4   40  160.0
B.5   50  156.0
B.6   70  198.0

Ницца! Это будет полезно для тех редких случаев, когда у меня не загружено dplyr

Dubukay 17.05.2022 19:49

Другие вопросы по теме