Mam dwie ramy danych zawierające zagregowane dane. Pierwsza rama danych składa się z medialnych wartości 3 grup (grupa 1, Grupa 2 i Grupa 3), które zostały poddane scenariuszowi A, B i C.

Moja druga rama danych składa się z wielkości próbki 3 grup (grupa 1, Grupa 2 i Grupa 3), które zostały poddane scenariuszowi A, B i C.

Dane wyglądają na coś takiego:

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))

Chcę przekonwertować wartości w kolumnach scenariusza w obu ramach danych w typach danych znaków i połączono wartość w jednej komórce pierwszej ramki danych (mediana) z odpowiednią komórką w drugiej ramce danych (rozmiar próbki).

Szukałem stackoverflow; To nie jest pytanie rbind / cbind. Pożądane wyjście, które mam na uwadze jest połączenie rzędowe 1 kolumna 1 z ramki danych 1 z rzędem 1 kolumna 1 z ramki danych 2 i tak dalej.

Pożądane wyjście wygląda na następujące: Pożądany wyjście

Próbowałem następującego kodu i jest prawie poprawny. Nie jestem pewien, jak zmienić go do 3 rzędów, 4 kolumny ramki danych i że rozmiar próbki do kolumny 1 (grupa) w wynikowej ramie danych nie powinna tam być.

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

Dziękuję i doceniam!

2
DTYK 4 czerwiec 2018, 06:11

3 odpowiedzi

Najlepsza odpowiedź

Możemy paste odpowiednie kolumny zarówno data.frame s z Map

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

Lub przekonwertować data.frame do matrix i 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)
2
akrun 4 czerwiec 2018, 03:44

Prześlij licznik do instrukcji Zastosuj, aby indeksować drugą dataframe

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)
4
Esther 4 czerwiec 2018, 03:46

Rozwiązanie z użyciem . Możemy przygotować oba klatki danych jako znak, użyj bind_rows, aby je połączyć, a następnie użyć group_by i summarise_all, aby połączyć wszystkie kolumny.

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)    
3
www 4 czerwiec 2018, 03:41