我一直坚持整洁的数据原则,并将我的数据框转换为长数据类型格式。但是,在这样做之后,我意识到我很难从长数据中创建散点图。
以下内容与我的数据类似。有三列:主题ID,键和值。列"键"指的是主题已完成的特定问题编号,其中"值为"列指的是给定问题的实际值。对于某些问题,可能会出现空白"价值"作为主题的专栏未能完成它们。
df <- data.frame(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
key = c("Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1",
"Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2",
"Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3"),
value = c(1, NA, 3, 4, 3, 5, 5, 3, 2, 7, 2, 1, 8, 3, NA, 1, 8, 2, 1, 4, 6, 7, 1, 5, NA, 1, 5, 8, NA, 3))
我尝试了以下代码来创建散点图:
library(ggplot2)
ggplot(na.omit(df), aes(x = value[key == "Q1"], y = value[key == "Q2"])) + geom_point()
然而,R提示我错误&#34;美学必须是长度1或与数据相同&#34;即使我使用na.omit来删除丢失的案例。
我在Stackoverflow上搜索过,发现了两个类似的线程。第一个帖子(见here)没有答案,而第二个线程有点相似&#34;线程(参见here)建议数据太整洁。对于后者,这是否意味着我应该&#34;不整洁&#34;我的数据,使每个问题/变量代替一列?
我打算在Shiny应用程序中使用这样的散点图(如果长格式数据源有效),使用类似下面的内容(这不起作用):
output$scatterplot <- renderPlot({
ggplot(df(), aes(x = input$value[var1], y = input$value[var2])) + geom_point()
谢谢,非常感谢!
编辑:
我已经从评论中尝试了@patL解决方案。代码本身就可以运行。但是,它对Shiny无效。
以下是我在Shiny中使用的代码:
# Define the User Interface for app
ui <- fluidPage(
titlePanel("Scatter Plot App"),
sidebarLayout(
sidebarPanel(
selectInput("x_scatter", "Select variable for x-axis", choices = unique(df$key)),
selectInput("y_scatter", "Select variable for y-axis", choices = unique(df$key))
),
mainPanel(
plotOutput("scatter")
)
)
)
# Define server logic for app
server <- function(input, output) {
scatter_data <- reactive({
df %>%
na.omit() %>%
spread(key, value)
})
output$scatter <- renderPlot({
ggplot(scatter_data(), aes(x = input$x_scatter, y = input$y_scatter)) + geom_point()
})
}
当我运行应用程序时,结果是散点图,中间有一个点,这是不正确的。还有更多的数字变量(例如Q3,Q4,Q5等),但在这个例子中,我把它们遗漏了。
答案 0 :(得分:0)
我已经设法在@patL帮助下回答了自己的问题。当我在aes
中使用ggplot
时,散点图无法在Shiny中工作。当我使用aes_string
时,散点图显示正确。
@patL建议使用以下dplyr管道:
df %>% na.omit() %>% spread(key, value)
我将其更改为以下内容:
df %>% spread(key, value) %>% filter(complete.cases(.))
上面的dplyr管道在删除具有NA值的行之前,首先将数据帧从长格式转换为宽格式。如果我在na.omit
之前使用过spread
,则每次我选择其他列作为散点图的输入时,R都会提示警告消息,指出它们已删除了包含缺少值的行。
Shiny应用程序的实际工作脚本如下:
library(shiny)
library(dplyr)
library(ggplot2)
library(tidyr)
df <- data.frame(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
key = c("Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1", "Q1",
"Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2",
"Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q3"),
value = c(1, NA, 3, 4, 3, 5, 5, 3, 2, 7, 2, 1, 8, 3, NA, 1, 8, 2, 1, 4, 6, 7, 1, 5, NA, 1, 5, 8, NA, 3))
ui <- fluidPage(
titlePanel("Scatter Plot App"),
sidebarLayout(
sidebarPanel(
selectInput("x_scatter", "Select variable for x-axis", choices = unique(df$key)),
selectInput("y_scatter", "Select variable for y-axis", choices = unique(df$key))
),
mainPanel(
plotOutput("scatter")
)
)
)
server <- function(input, output) {
scatter_data <- reactive({
df %>%
spread(key, value) %>%
filter(complete.cases(.))
})
output$scatter <- renderPlot({
ggplot(scatter_data(), aes_string(x = input$x_scatter, y = input$y_scatter)) + geom_point()
})
}
shinyApp(ui = ui, server = server)