Можно ли объединить две строки в одну и использовать объединенное имя для назначения фрейма данных? - PullRequest
0 голосов
/ 04 июля 2019

Я хочу создать функцию, которая будет принимать данные и иметь строку, назначенную GENDER. Функция найдет среднее значение и sd для каждой переменной в df по GENDER и вернет фрейм данных со всей этой информацией в новый df с именем "GENDERstats", который я мог бы использовать в дальнейшем анализе.

Я могу получить все, что захочу, пока я не назову новый "GENDERstats" df, тогда он выдаст ошибку

Вот что у меня есть, с фиктивными данными

df <- data.frame(GENDER=c("M","F","M","F","M","F"),HELP=c(5,4,2,7,5,5),CARE=c(6,4,7,8,5,4),TRUST=c(6,5,3,6,8,6),SERVE=c(6,5,7,8,7,6))

my.func <- function(dat, bias){
datFrame <- data.frame()
  for(i in 2:5){
    d1 <- aggregate(dat[,i],by=list(dat[,bias]),FUN=mean,na.rm=TRUE)
    d2 <- aggregate(dat[,i],by=list(dat[,bias]),FUN=sd,na.rm=TRUE)
    d1$sd <- d2$x
    d1$Var <- i
    datFrame <- rbind(datFrame,d1)
  }
    # paste(bias,"stats") <- datFrame
}


Я получаю df, который хочу, в "datFrame", но я хочу вставить переменную смещения и "stats", чтобы создать новый фрейм данных. Я буду делать это с несколькими различными "уклонами"

Я хочу, чтобы новый df выглядел так:

  Group.1        x        sd Var
1       F 5.333333 1.5275252   2
2       M 4.000000 1.7320508   2
3       F 5.333333 2.3094011   3
4       M 6.000000 1.0000000   3
5       F 5.666667 0.5773503   4
6       M 5.666667 2.5166115   4
7       F 6.333333 1.5275252   5
8       M 6.666667 0.5773503   5

и оттуда я могу строить графики или фокусироваться только на средствах или sds

1 Ответ

0 голосов
/ 04 июля 2019

Я не совсем уверен, как исправить вашу функцию (пара деталей отсутствует), но вы можете получить те же результаты без определенной пользователем функции или цикла for.Следующие итерации по комбинациям GENDER + других переменных, генерируют средние значения и SD с aggregate, а затем rbind s кадры данных в do.call:

do.call("rbind", lapply(2:ncol(df),
                        function(j) {
                            df_out <- aggregate(df[j], list(df$GENDER), "mean")
                            df_out[3] <-
                                aggregate(df[j], list(df$GENDER), "sd")[[2]]
                            df_out[4] <- j
                            `names<-`(df_out, c("gender", "x", "sd", "var"))
                        }))


#### OUTPUT ####

  gender       x      sd var
1      F 5.33333 1.52753   2
2      M 4.00000 1.73205   2
3      F 5.33333 2.30940   3
4      M 6.00000 1.00000   3
5      F 5.66667 0.57735   4
6      M 5.66667 2.51661   4
7      F 6.33333 1.52753   5
8      M 6.66667 0.57735   5

Я не уверен, еслинет более подходящего способа сделать это на базе R. Лично я бы выбрал dplyr gather + group_by + summarise, который намного чище и проще для понимания.Вывод почти такой же, как и выше, только в другом порядке.Округление выглядит иначе только из-за того, как напечатаны тиблы:

library(dplyr)  
library(tidyr)  

df %>% 
    gather(var, val, -GENDER) %>% 
    group_by(GENDER, var) %>% 
    summarise(x = mean(val), sd = sd(val))

#### OUTPUT ####

# A tibble: 8 x 4
# Groups:   GENDER [2]
  GENDER var       x    sd
  <chr>  <chr> <dbl> <dbl>
1 F      CARE   5.33 2.31 
2 F      HELP   5.33 1.53 
3 F      SERVE  6.33 1.53 
4 F      TRUST  5.67 0.577
5 M      CARE   6    1    
6 M      HELP   4    1.73 
7 M      SERVE  6.67 0.577
8 M      TRUST  5.67 2.52 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...