我试图在R中使用ggplot2基于2个变量绘制2行。这是我正在使用的完整Framingham数据集中的一段:
df2 = read.table(text = " number smoker BMI sex
98 No 27.73 Men
99 No 24.35 Men
100 No 25.60 Men
101 Yes 24.33 Men
102 Yes 27.54 Men
299 No 24.62 Women
300 No 31.02 Women
301 Yes 21.68 Women
302 Yes 19.66 Women
303 Yes 26.64 Women", sep = "", header = TRUE)
我在ggplot中尝试了以下内容并得到了一个我不想要的图表。
ggplot(df2, aes(smoker, BMI, color=sex)) + geom_line() + geom_point()
我希望有两条线,一条用于男性,一条用于女性。我希望每个吸烟者类别中的要点代表该性别群体的平均值。
知道如何使用此数据集执行此操作吗?我在stackoverflow上找到了与其他数据集一起使用的示例。
答案 0 :(得分:1)
我找到了一种方法,但如果有人可以提供帮助,我仍然在寻找更聪明的方法。
df3 <- with(df, tapply(BMI, list(smoker, sex), mean))
smoker <- c("No", "Yes", "No", "Yes")
sex <- c("Men", "Men", "Women", "Women")
BMI <- c(df3[1,1], df3[2,1], df3[1,2], df3[2,2])
df4 <- data.frame(smoker, sex, BMI)
ggplot(df4, aes(smoker, BMI, color=sex)) + geom_line(aes(group=sex)) + geom_point()
答案 1 :(得分:1)
图表中的图片对理解您要做的事情有很大帮助。使用带有plyr包的汇总的ddply执行与tapply相同的计算,但是将结果返回到ggplot可以直接使用的数据框中。鉴于在两个示例中使用了不同的数据,下面的代码似乎在R:
中重现您的图表 library(plyr)
df3 <- ddply(df2,.(sex, smoker), summarize, BMI_mean=mean(BMI))
ggplot(df3,aes(as.numeric(smoker), BMI_mean, color=sex)) + geom_line() +
scale_x_discrete("Current Sig Smoker Y/N", labels=levels(df3$smoker)) +
labs(y="Mean Body Mass Index (kg/(M*M)", color="SEX")