从具有不同行数的单独数据框创建箱线图
Create boxplots from separate data frames with different number of rows
我正在尝试制作一个数据框,然后从中创建一个箱线图。数据框应包含 3 个不同大小的向量。假设数据当前位于 a$data
、b$data
和 c$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)
我正在尝试制作一个数据框,然后从中创建一个箱线图。数据框应包含 3 个不同大小的向量。假设数据当前位于 a$data
、b$data
和 c$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)