【问题标题】:Create boxplots from separate data frames with different number of rows从具有不同行数的单独数据框创建箱线图
【发布时间】:2021-05-09 03:07:44
【问题描述】:

我正在尝试制作一个数据框,然后从中创建一个箱线图。数据框应包含 3 个不同大小的向量。假设数据当前位于a$datab$datac$data,长度分别为7、50、200。

这是我的代码的简化版本,其中cbind 步骤错误:

# create initial df
    df <- data.frame()
# set column names
    colnames(df) <- c("a", "b", "c")
# bind original data to new data frame: 
    df <- cbind(df, a$data, b$data, c$data)
# draw boxplot
    boxplot(df)

【问题讨论】:

  • df &lt;- data.frame 创建一个与函数data.frame 完全相同的函数。在 R 中,这与 x &lt;- 1; y &lt;- x 相同。对象xy 现在是identical()。看看identical(df, data.frame) 返回什么。你能发布dput(head(a$data))的输出吗?
  • 也许这只是您的示例代码,但df 这里将是一个函数,而不是数据对象。 (也许我对你的样本数据过于直白了。)此外,你不能 cbind 不同行数的帧......好吧,你有时可以侥幸逃脱,但如果它没有警告或错误, 你应该担心(并且更加小心)。
  • @RuiBarradas - 当然,看起来像:c(7.8192479, 7.910274, 7.51289579, 7.189279, 7.5897185, 7.14218948)
  • 抱歉,data.frame 确实只是一个例子,我现在编辑一下。
  • A data.frame 不能“包含 [...] 不同大小的向量”。但是列表可以,例如l = list(x = rnorm(5, 2), y = rnorm(10, 3), z = rnorm(20, 1))。和boxplot 愉快地吃名单:; boxplot(l).

标签: r plot boxplot


【解决方案1】:

data.frame 不能“包含 [...] 不同大小的向量”。但是列表可以,例如

l = list(x = rnorm(5, 2), y = rnorm(10, 3), z = rnorm(20, 1)).

boxplot 开心地吃名单:

boxplot(l)

【讨论】:

  • 我在今天的10,000 people 中。 (并不是说我这些天经常使用基本 R 箱线图,但是……我怎么不知道呢?)
  • 不要绝望 @r2evans,这个冬天是您坐在 Chesterfield 扶手椅上的最佳时机,您最喜欢的勃艮第红和...R 参考索引。
  • 是的,那本手册是……引人入胜的……动作序列可能是除了韦氏词典之外的任何东西都无法比拟的。
【解决方案2】:

试试下面的代码,看看能否解决问题。
它以长格式创建一个数据集,其中包含变量"a""b""c" 及其各自值的列向量。然后用公式界面绘制数据。

variable <- rep(c("a", "b", "c"), 
                c(length(a$data),length(b$data), length(c$data)))
value <- c(a$data, b$data, c$data)

df <- data.frame(variable, value)
boxplot(value ~ variable, data = df)

【讨论】:

    【解决方案3】:

    我倾向于从“长数据”的角度来考虑箱线图组。

    假数据:

    set.seed(2021)
    df1 <- data.frame(x=runif(10)); df2 <- data.frame(x=runif(20)); df3 <- data.frame(x=runif(100))
    head(df1,3); head(df2,3); head(df3,3)
    #           x
    # 1 0.4512674
    # 2 0.7837798
    # 3 0.7096822
    #            x
    # 1 0.02726706
    # 2 0.83749040
    # 3 0.60324073
    #            x
    # 1 0.03277595
    # 2 0.94270937
    # 3 0.94773844
    

    合并成一个长帧:

    # tidyverse
    dfall <- dplyr::bind_rows(dplyr::lst(df1, df2, df3), .id = "id")
    
    # data.table
    dfall <- rbindlist(list(df1=df1, df2=df2, df3=df3), idcol = "id")
    
    # base R
    lst_of_frames <- list(df1=df1, df2=df2, df3=df3)
    lst_of_frames <- Map(function(x,nm) transform(x, { id = nm }), lst_of_frames, names(lst_of_frames))
    dfall <- do.call(rbind, lst_of_frames)
    

    剧情:

    boxplot(x ~ id, data = dfall)
    

    【讨论】:

      猜你喜欢
      • 2019-03-22
      • 2020-01-23
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 2020-01-07
      相关资源
      最近更新 更多