从具有不同行数的单独数据框创建箱线图

Create boxplots from separate data frames with different number of rows

我正在尝试制作一个数据框,然后从中创建一个箱线图。数据框应包含 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)

试试下面的代码,看看是否能解决问题。
它以长格式创建一个数据集,其中包含变量 "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)

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

假数据:

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)

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

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

并且boxplot愉快地吃清单:

boxplot(l)