Условное добавление символов в новый столбец на основе отдельного набора данных

#r #dataframe #dplyr

#r #фрейм данных #dplyr

Вопрос:

Всем привет и заранее благодарю вас.

Я хотел бы добавить новый столбец в мой уже существующий фрейм данных, в котором значения получены из второго фрейма данных на основе определенных условий. Набор данных, в который я хочу добавить новый столбец («data_melt»), имеет много разных идентификаторов выборки (sample.#) под переменным столбцом. Использование второго набора данных («метаданные») Я хочу добавить имена прудов в новый столбец «data_melt» на основе идентификаторов образцов. Идентификаторы образцов одинаковы в обоих наборах данных.

Моя интуиция подсказывает мне, что есть очевидное решение, но моя голова довольно жареная. Вот игрушечный пример моего data_melt df (с момента его 25 000 наблюдений):

 > dput(toy)
structure(list(gene = c("serA", "mdh", "fdhB", "fdhA"), process = structure(c(1L, 
1L, 1L, 1L), .Label = "energy", class = "factor"), category = structure(c(1L, 
1L, 1L, 1L), .Label = "metabolism", class = "factor"), ko = structure(1:4, .Label = c("K00058", 
"K00093", "K00125", "K00148"), class = "factor"), variable = structure(c(1L, 
2L, 3L, 3L), .Label = c("sample.10", "sample.19", "sample.72"
), class = "factor"), value = c(0.00116, 2.77e-05, 1.84e-05, 
0.0125)), row.names = c(NA, -4L), class = "data.frame")
  

И вот игрушечный пример моих метаданных df:

 > dput(toy)
structure(list(sample = c("sample.10", "sample.19", "sample.72", 
"sample.13"), pond = structure(c(2L, 2L, 1L, 1L), .Label = c("lower", 
"upper"), class = "factor")), row.names = c(NA, -4L), class = "data.frame")
  

Еще раз спасибо!

Ответ №1:

Мы можем использовать match from base R для создания числового индекса для замены значений

 toy$pond <- with(toy, out$pond[match(variable, out$sample)])
  

Ответ №2:

Я считаю, что слияние будет работать здесь.

 sss <- structure(list(gene = c("serA", "mdh", "fdhB", "fdhA"), process = structure(c(1L, 
1L, 1L, 1L), .Label = "energy", class = "factor"), category = structure(c(1L, 
1L, 1L, 1L), .Label = "metabolism", class = "factor"), ko = structure(1:4, .Label = c("K00058", 
"K00093", "K00125", "K00148"), class = "factor"), variable = structure(c(1L, 
2L, 3L, 3L), .Label = c("sample.10", "sample.19", "sample.72"
), class = "factor"), value = c(0.00116, 2.77e-05, 1.84e-05, 
0.0125)), row.names = c(NA, -4L), class = "data.frame")

ss <- structure(list(sample = c("sample.10", "sample.19", "sample.72", 
"sample.13"), pond = structure(c(2L, 2L, 1L, 1L), .Label = c("lower", 
"upper"), class = "factor")), row.names = c(NA, -4L), class = "data.frame")

ssss <- merge(sss, ss, by.x = "variable", by.y = "sample")
  

Ответ №3:

Вы можете использовать left_join() из пакета dplyr после переименования sample в variable во фрейме данных метаданных.

 library(tidyverse)

data_melt <- structure(list(gene = c("serA", "mdh", "fdhB", "fdhA"), 
                            process = structure(c(1L, 1L, 1L, 1L), 
                                                .Label = "energy", 
                                                class = "factor"), 
                            category = structure(c(1L, 1L, 1L, 1L), 
                                                 .Label = "metabolism", 
                                                 class = "factor"), 
                            ko = structure(1:4, 
                                           .Label = c("K00058", "K00093", "K00125", "K00148"), 
                                           class = "factor"), 
                            variable = structure(c(1L, 2L, 3L, 3L), 
                                                 .Label = c("sample.10", "sample.19", "sample.72"), 
                                                 class = "factor"), 
                            value = c(0.00116, 2.77e-05, 1.84e-05, 0.0125)), 
                       row.names = c(NA, -4L), 
                       class = "data.frame")

metadata <- structure(list(sample = c("sample.10", "sample.19", "sample.72", "sample.13"), 
                           pond = structure(c(2L, 2L, 1L, 1L), 
                                            .Label = c("lower", "upper"), 
                                            class = "factor")), 
                      row.names = c(NA, -4L), 
                      class = "data.frame") %>%
  # Renaming the column, so we can join the two data sets together
  rename(variable = sample)

data_melt <- data_melt %>%
  left_join(metadata, by = "variable")