2015-05-25 3 views
2

В настоящее время я пытаюсь создать функцию, которая будет форматировать мои данные и правильно, и вернуть отсортированный график. Тем не менее по какой-то причине я продолжаю получать эту ошибку:Функция для форматирования и построения графика в R

Error in `$<-.data.frame`(`*tmp*`, "Var1", value = integer(0)) : 
    replacement has 0 rows, data has 3 

Я попытался отладить ее, но не повезло. У меня есть пример того, чего я ожидаю внизу. Может ли кто-нибудь определить, что я делаю неправильно?

x <- rep(c("Mark","Jimmy","Jones","Jones","Jones","Jimmy"),2) 
y <- rnorm(12) 
df <- data.frame(x,y) 


plottingfunction <- function(data, name,xlabel,ylabel,header){ 
    newDf <- data.frame(table(data)) 
    order <- newDf[order(newDf$Freq, decreasing = FALSE), ]$Var1 
    newDf$Var1 <- factor(newDf$Var1,order) 
    colnames(newDf)[1] <- name 

    plot <- ggplot(newDf, aes(x=name, y=Freq)) + 
       xlab(xlabel) + 
       ylab(ylabel) + 
       ggtitle(header) + 
       geom_bar(stat="identity", fill="lightblue", colour="black") + 
       coord_flip() 
    return(plot) 

} 

plottingfunction(df$x, "names","xlabel","ylabel","header") 

enter image description here

ответ

2

Несколько комментариев, ваша функция не работает, потому что эта часть не является правильным:

order <- newDf[order(newDf$Freq, decreasing = FALSE), ]$Var1 

Поскольку мы понятия не имеем, если будут какие столбцы data, который имеет название столбца Var1. То, что выглядит как СЛУЧИЛОСЬ, когда вы пытаетесь ваш код Ран:

newDf <- data.frame(table(df$x)) 

, который сразу же переименовали свой столбец Var1, но при запуске вашей функции, название было изменено. Поэтому, чтобы обойти это, я бы рекомендовал быть явным с вашими именами столбцов. В этом примере я использовал библиотеку dplyr, чтобы облегчить мою жизнь. Поэтому следующий код и логику это будет выглядеть следующим образом:

newDf <- data %>% group_by_(col_name) %>% tally 
order <- newDf[order(newDf$n, decreasing = FALSE), col_name][[col_name]] 
data[,col_name] <- factor(data[,col_name], order) 

Тогда в вашем ggplot мы можем использовать aes_string для обозначения имени столбца фрейма данных вместо. И тогда вся функция будет выглядеть следующим образом:

plottingFunction <- function(data, col_name, xlabel, ylabel, header) { 
    #' create a dataframe with the data that we're interested in 
    #' make sure that you preserve the anme of the column that you're 
    #' counting on... 
    newDf <- data %>% group_by_(col_name) %>% tally 
    order <- newDf[order(newDf$n, decreasing = FALSE), col_name][[col_name]] 
    data[,col_name] <- factor(data[,col_name], order) 

    plot <- ggplot(data, aes_string(col_name)) + 
    xlab(xlabel) + 
    ylab(ylabel) + 
    ggtitle(header) + 
    geom_bar(fill="lightblue", colour="black") + 
    coord_flip() 
    return(plot) 
} 

plottingFunction(df, "x", "xlabel","ylabel","header") 

Какой бы выход, как:

enter image description here

Я думаю, что для вашего участка, имеющего stat="identity" является излишним, поскольку вы можете просто использовать исходный кадр данных а не иметь преобразованный.

Смежные вопросы