#r #merge #dataframe
#r #слияние #фрейм данных
Вопрос:
Код для получения фреймов данных:
rat_all = structure(list(frequency = c(37L, 31L, 14L, 11L, 2L, 3L), isoforms = 8:13,
type = structure(c("rat_all", "rat_all", "rat_all", "rat_all",
"rat_all", "rat_all"), .Dim = c(6L, 1L))), .Names = c("frequency",
"isoforms", "type"), row.names = 8:13, class = "data.frame")
rat_ensembl = structure(list(frequency = c(17L, 8L, 20L), isoforms = 8:10,
type = structure(c("rat_ensembl", "rat_ensembl", "rat_ensembl"
), .Dim = c(3L, 1L))), .Names = c("frequency", "isoforms",
"type"), row.names = 8:10, class = "data.frame")
У меня есть два фрейма данных:
frequency isoforms type
8 17 8 rat_ensembl
9 8 9 rat_ensembl
10 20 10 rat_ensembl
и
frequency isoforms type
8 37 8 rat_all
9 31 9 rat_all
10 14 10 rat_all
11 11 11 rat_all
12 2 12 rat_all
13 3 13 rat_all
Я хотел бы объединить их в один фрейм данных, но также включить отсутствующие
isoforms
записи, которые появляются в rat_all
фрейме данных, но не в rat_ensembl
фрейм данных. Итак, я бы хотел, чтобы на выходе был объединенный фрейм данных, как если бы я повторно связал
два фрейма данных, но дополненные:
11 0 11 rat_ensembl
12 0 12 rat_ensembl
13 0 13 rat_ensembl
Я думал, что смогу сделать это с помощью merge, но в итоге получается огромная путаница, которую я должен размотать, которую я могу в конечном итоге преобразовать в правильный формат, но это не очень хорошее решение, если
Я хотел сделать это для четырех или пяти разных «типов» одновременно. Чего мне не хватает? Спасибо!
Для ясности я хочу получить окончательный фрейм данных, который выглядит как:
frequency isoforms type
1 17 8 rat_ensembl
2 8 9 rat_ensembl
3 20 10 rat_ensembl
4 37 8 rat_all
5 31 9 rat_all
6 14 10 rat_all
7 11 11 rat_all
8 2 12 rat_all
9 3 13 rat_all
10 0 11 rat_ensembl
11 0 12 rat_ensembl
12 0 13 rat_ensembl
Я могу заставить его делать то, что я хочу, если я использую:
z = merge(rat_ensembl, rat_all, by.x="isoforms", by.y="isoforms", all.y=TRUE)
isoforms frequency.x type.x frequency.y type.y
7 7 44 rat_ensembl 69 rat_all
8 8 17 rat_ensembl 37 rat_all
9 9 8 rat_ensembl 31 rat_all
10 10 20 rat_ensembl 14 rat_all
11 11 NA <NA> 11 rat_all
12 12 NA <NA> 2 rat_all
13 13 NA <NA> 3 rat_all
14 14 NA <NA> 1 rat_all
Тогда теоретически я мог бы выделить isoforms
, frequency.x
type.x
столбцы и
исправьте их, чтобы они были правильными для каждого из rat_ensembl
и rat_all
, а затем rbind
эти
фреймы данных объединены, но, похоже, должно быть что-то, что просто обрабатывает это напрямую.
Комментарии:
1. что вы пробовали с merge? Какие общие столбцы вы хотите объединить? частота, изоформы, тип? Все вышеперечисленное? После того, как вы определили общие столбцы, необходимо указать, требуется ли вам внутреннее, левое, правое или внешнее объединение, указав аргументы «все». Кроме того, можете ли вы обновить свой вопрос фрагментом кода, который люди могут вставить в свои сеансы R? используйте
dput()
и вставьте содержимое в свой вопрос.2. Спасибо за предложение dput, это очень полезно. Я добавил дополнительную информацию к сообщению.
Ответ №1:
может быть, вы хотите что-то вроде этого
z <- merge(rat_ensembl, rat_all, all = TRUE)
iso_diff <- setdiff(rat_all$isoforms, rat_ensembl$isoforms)
augmented <- data.frame(frequency = 0, isoforms = iso_diff, type = "rat_ensembl", stringsAsFactors= FALSE)
df_all <- rbind(z, augmented)
Надеюсь, это поможет.
Комментарии:
1. Привет, Изельцер, похоже, это просто дает мне тот же результат, что и повторная привязка двух фреймов данных вместе. Я ищу какой-нибудь способ дополнить это некоторыми данными, которые отсутствуют в одном из фреймов данных. Я обновил свой пост, чтобы он был немного более понятным. Спасибо!
2. @rory, я только что обновил свой anwser, чтобы включить то, что ты действительно хотел. Я не знаю, есть ли более простой способ для этого. Если кто-то знает об этом, пожалуйста, опубликуйте это.
3. Спасибо Изельцеру, функция setdiff для меня новая. Я думаю, что это решение подойдет мне, но оно работает только в том случае, если я точно знаю, что все различия обусловлены одним условием. Однако в моем случае это так. Спасибо!