【问题标题】:How to aggregate and plot data of a data frame如何聚合和绘制数据框的数据
【发布时间】:2019-09-13 16:44:06
【问题描述】:

我的原始数据

head(predictionDB)
  Helpful X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22
1       1  1  1  1  0  1  1  0  0  0   0   1   1   0   0   0   1   1   0   0   1   0   0
2       0  1  0  0  0  0  1  0  0  0   1   0   1   1   0   0   0   0   0   1   0   1   0

我使用以下代码对它们进行了汇总:

plotDB <- aggregate(predictionDB, 
                    list(predictionDB$Helpful), 
                    mean)

这是输出数据

> plotDB
  Group.1 Helpful        X1        X2        X3        X4        X5        X6        X7        X8        X9       X10       X11      X12       X13       X14       X15       X16       X17       X18       X19       X20       X21       X22
1       0       0 0.1666192 0.1857021 0.2418114 0.2258616 0.1774423 0.1874110 0.2603247 0.1777271 0.1407007 0.1540872 0.1794361 0.174879 0.1859869 0.3691256 0.2574765 0.1569353 0.2455141 0.1726004 0.1572202 0.2016520 0.2267160 0.1911136
2       1       1 0.2896282 0.3180039 0.2896282 0.3072407 0.2666341 0.3228963 0.2793542 0.2818004 0.2504892 0.2607632 0.2588063 0.316047 0.3317025 0.2896282 0.3003914 0.2656556 0.3047945 0.2999022 0.3126223 0.3131115 0.2813112 0.3131115

现在我想创建一个包含 x 轴上的变量的图,以便比较 Helpful = 0 和 Helpful = 1 的所有变量 X 的均值。

使用以下代码为我提供了我需要的两个有用类与每个变量的图,但 x 轴上根本没有标签。

问题:

  • y 轴仅上升到 0.30,而在某些情况下高于它
  • 栏下没有帮助类 (1,0) 的标签
barplot(t(as.matrix(plotDB[,3:nTopicsLDA])), 
        beside=TRUE)

其中 nTopicsLDA 是一个数值变量,在本例中为 22。

非常感谢您!

【问题讨论】:

  • 什么是 nTopicsLDA ?您能否提供所有数据集或最小示例,以使我们能够重现您提供的不良条形图。您的数据类型是什么?谢谢

标签: r dataframe plot bar-chart


【解决方案1】:

由于 barplot 使用底层矩阵的列标题作为 x 轴标签,您的绘图不会呈现 x 轴标签,因为 t(as.matrix(...)) 返回一个空的 colnames

colnames(t(as.matrix(plotDB[,3:nTopicsLDA])))
# NULL

考虑将宽数据框改造成长格式(通常是大多数数据分析操作(包括绘图)的首选结构)并使用tapply 构建绘图矩阵:

# RESHAPE WIDE TO LONG
predictionDB_long <- reshape(predictionDB, idvar = "Helpful",
                             varying=names(predictionDB)[-1], v.names="Value",
                             times = names(predictionDB)[-1], timevar = "X",
                             new.row.names = 1:1E5, direction="long")

# TAPPLY MEAN CALL ON TWO GROUPINGS FOR 2-D MATRIX
plot_mat <- with(predictionDB_long, tapply(Value, list(X, Helpful), mean))

# RE-ORDER COLUMNS
plot_mat <- plot_mat[paste0("X", 1:nTopicsLDA),]

这样做,plot_matcolnames 成为 x 轴标签。但是,默认情况下只渲染一个 x 轴标签:

# BAR PLOT WITH ONE AXIS
barplot(plot_mat, ylim=c(0, 0.6), beside=TRUE, cex.names=0.75,
        main = "Mean Helpful Bar Plot")

对于两个轴,您需要一个定制的解决方案,例如调用axis(),根据字体大小相应地调整水平和填充参数。了解如何整合 row.names。请注意 Helpful 条的二进制集之间的中间空间的调整:

# BAR PLOT WITH TWO AXES
barplot(plot_mat, ylim=c(0, 0.6), beside=TRUE, cex.names=0.75,
        main = "Mean Helpful Bar Plot")

axis(1, at=1:(nTopicsLDA*2 + 2), hadj=-0.5, padj=-2,
     labels=c(row.names(plot_mat), "", row.names(plot_mat), ""), cex.axis=0.5)


数据

set.seed(9132019)
predictionDB <- data.frame(Helpful = sample(c(0, 1), 500, replace=TRUE),
                           replicate(22, sample(c(0, 1), 500, replace=TRUE))
)
nTopicsLDA <- ncol(predictionDB) - 1

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 2015-01-23
    • 2020-03-01
    • 2018-11-08
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多