不同长度向量的箱型图

8
我有一个包含两列的矩阵,我想要分别绘制这两列的箱线图,但是它们的条目数量不同。例如,第一列有10个条目,而第二列只有7个条目,剩下的3个条目为零。为了比较,我想将它们并排绘制。是否有办法告诉R只对第一列绘制整个箱线图,而对第二列仅绘制前7个条目的箱线图?
2个回答

11
你可以简单地索引你想要的值,例如:
## dummy version of your data
mat <- matrix(c(1:17, rep(0, 3)), ncol = 2)

## create object suitable for plotting with boxplot
## I.e. convert to melted or long format
df <- data.frame(values = mat[1:17],
                 vars = rep(c("Col1","Col2"), times = c(10,7)))

## draw the boxplot
boxplot(values ~ vars, data = df)

在上面,我按照你的说法假设你有一个矩阵。如果你实际上拥有的是数据框,则需要

df <- data.frame(values = c(mat[,1], mat[1:7, 2]),
                 vars = rep(c("Col1","Col2"), times = c(10,7)))

我假设两列数据是可比较的,因为这两列数据的存在意味着它们是一个分类变量,可以通过该变量将值分割(例如男女身高,以性别为分类变量)。

生成的箱线图如下所示:

图片描述


谢谢,太棒了。只是为了确保我理解正确,您将从“mat”到“values”读取所有内容作为向量。然后创建具有两列的“vars”变量,“times”告诉“vars”前10个属于col1,接下来的7个属于col2?我理解得对吗? - user1007742
不完全正确;我只读取了 mat 的前17个值,但你的其余部分是正确的。 - Gavin Simpson
我该如何将这个操作应用到三个向量而不是两个? - user1007742
只是想提醒一下,boxplot(values ~ var, data = df) 应该是 boxplot(values ~ vars, data = df)。否则,这个函数运行得很好。 - bdetweiler

3
无论有多少列和空条目,您可以像这样操作。
## Load data from CSV; first row contains column headers
dat <- read.csv( 'your-filename.csv', header = T )

## Set plot region (when set 'ylim' skip first row with headers)
plot(
  1, 1, 
  xlim=c(1,ncol(dat)), ylim=range(dat[-1,], na.rm=T), 
  xaxt='n', xlab='', ylab=''
)
axis(1, labels=colnames(dat), at=1:ncol(dat))

for(i in 1:ncol(dat)) {
  ## Get i-th column
  p <- dat[,i]

  ## Remove 0 values from column
  p <- p[! p %in% 0]
  ## Instead of 0 you can use any values
  ## For example, you can remove 1, 2, 3
  ##   p <- p[! p %in% c(1,2,3)]

  ## Draw boxplot
  boxplot(p, add=T, at=i)
}

这段代码从CSV文件中加载表格,删除列中的0值(或者你可以删除其他任何值),并在一个图形中绘制每一列的所有箱线图。
希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接