Объединение значения ячейки в одном кадре данных с соответствующим значением ячейки в другом кадре данных - PullRequest
0 голосов
/ 04 июня 2018

У меня есть два фрейма данных, содержащих агрегированные данные.Первый кадр данных состоит из медианных значений 3 групп (Группа 1, Группа 2 и Группа 3), которые прошли сценарии A, B и C.

Мой второй кадр данных состоит из размера выборки3 группы (Группа 1, Группа 2 и Группа 3), которые прошли сценарии A, B и C.

Данные выглядят примерно так:

median_data <- data.frame(Group = c(1, 2, 3), scenario_A = c(296.7, 152.3, 113.6), 
                      scenario_B = c(109, 76, 79), scenario_C = c(321.5, 236.5, 191))

sample_size_data <- data.frame(Group = c(1, 2, 3), scenario_A = c(113, 121, 59),
                           scenario_B = c(100, 100, 55), scenario_C = c(100, 100, 55))

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

Я искал в Stackoverflow;это не вопрос rbind / cbind.Нужный вывод, который я имею в виду, состоит в объединении строки 1 столбца 1 из фрейма данных 1 со строкой 1 столбца 1 из фрейма данных 2 и т. Д.

Требуемый результат выглядит следующим образом: Desired Output

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

df <- data.frame(paste(apply(median_data, 2, as.character), " (n = ", 
                   apply(sample_size_data, 2, 
                         as.character), ")",sep = ""))

Спасибо и большоеоценили!

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Решение с использованием .Мы можем подготовить оба фрейма данных в виде символов, использовать bind_rows для их объединения, а затем использовать group_by и summarise_all для объединения всех столбцов.

library(dplyr)

median_data2 <- median_data %>%
  mutate_at(vars(-Group), funs(as.character(.)))

sample_size_data2 <- sample_size_data %>%
  mutate_at(vars(-Group), funs(paste0("(n = ", ., ")")))

dat <- bind_rows(median_data2, sample_size_data2) %>%
  group_by(Group) %>%
  summarise_all(funs(paste(., collapse = " "))) %>%
  ungroup()
dat
# # A tibble: 3 x 4
#   Group scenario_A      scenario_B    scenario_C     
#   <dbl> <chr>           <chr>         <chr>          
# 1     1 296.7 (n = 113) 109 (n = 100) 321.5 (n = 100)
# 2     2 152.3 (n = 121) 76 (n = 100)  236.5 (n = 100)
# 3     3 113.6 (n = 59)  79 (n = 55)   191 (n = 55)    
0 голосов
/ 04 июня 2018

Передайте счетчик в инструкцию apply для индексации второго кадра данных

i<-1

x<-as.data.frame(apply(median_data[,-1], 2, function(x) {
  i<<-i+1
  paste0(x, " (n = ",sample_size_data[,i],")")
}))

x<-cbind(Group=median_data[,1], x)

x
  Group      scenario_A    scenario_B      scenario_C
1     1 296.7 (n = 113) 109 (n = 100) 321.5 (n = 100)
2     2 152.3 (n = 121)  76 (n = 100) 236.5 (n = 100)
3     3  113.6 (n = 59)   79 (n = 55)    191 (n = 55)
0 голосов
/ 04 июня 2018

Мы можем paste соответствующие столбцы обоих data.frame s с Map

out <- median_data
out[-1] <- Map(function(x, y) sprintf("%0.1f (n = %d)", x, y),  
            median_data[-1], sample_size_data[-1])

Или преобразовать data.frame в matrix и paste

out  <- median_data
out[-1] <-  paste0(as.matrix(median_data[-1]), " (n=", 
              as.matrix(sample_size_data[-1]), ")") 

out
#   Group    scenario_A  scenario_B    scenario_C
#1     1 296.7 (n=113) 109 (n=100) 321.5 (n=100)
#2     2 152.3 (n=121)  76 (n=100) 236.5 (n=100)
#3     3  113.6 (n=59)   79 (n=55)    191 (n=55)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...