sapply

时间:2016-02-17 07:29:33

标签: r sapply

我正在尝试将列表中传递的名称作为情节标题添加到使用sapply的一系列箱图中,但我遇到了麻烦。

首先生成玩具数据以说明问题。

set.seed(12345)

df <- data.frame(v = rep(letters[1:3], times = 4))

for (i in 1:21) { 
     x <- rnorm(12, 3, 1) 
     df <- cbind(df, x)
     }

colnames (df)<- c("group", paste(rep(letters[1:7], each = 3), rep(1:3,  times = 7), sep = ""))

这为我们提供了一个数据集,其中的列由列名的第一个字母聚类。这类似于我自己的数据集,其中有一个问卷调查,在多个时间点(很多时间点)测量多个项目。该问卷产生了几个因子得分。因此,有几个列的列表示多次测量的问卷的每个因素。在这个玩具数据集中,我们可以将列名中的字母视为指示哪个因子,以及指示哪个时间点的数字。

我希望能够通过一个sapply函数选择我制作框图的集群/因子。所以我需要创建一个列表,其组件是每个列名称的集合。

colsList <-list (aCols <- c("a1", "a2", "a3"),
                 bCols <- c("b1", "b2", "b3"),
                 cCols <- c("c1", "c2", "c3"),
                 dCols <- paste("d", 1:3, sep = ""),
                 eCols <- paste("e", 1:3, sep = ""),
                 fCols <- paste("f", 1:3, sep = ""),
                 gCols <- paste("g", 1:3, sep = ""))

现在制作一个boxplot函数。我想根据组制作每个聚类因子的图。

boxplotFunct <- function (DV, IV, Title) {
                 boxplot(DV ~ IV, main = Title, horizontal = TRUE)
}

现在在一个sapply循环中调用该函数。

par(mfrow = c(1,3))

sapply(df[,colsList[[1]]], function(x) boxplotFunct(x, df$group, colsList[[1]]))

箱图工作但每个箱图的标题包含所有三个列名而不是相应的列名。在使用sapply时我该怎么做?

我会欢迎有关如何更好地完成整个过程的建议,但我主要想提一下如何解决我的特定问题的建议:在sapply循环中包含另一个循环(因为这更适合我的一般了解申请家庭而不是如何绘制图表。

2 个答案:

答案 0 :(得分:1)

您可以使用

sapply(seq(lengths(colsList)[[1]]), function(x) 
  boxplotFunct(df[,colsList[[1]][x] ], df$group, colsList[[1]][x]))

即。使用索引。

答案 1 :(得分:1)

在迭代sapply而不是colsList[[1]]时,您的df[, colsList[[1]]]代码可以大大减少。

sapply(colsList[[1]], function(x) {
  boxplotFunct(df[, x], df$group, x)
})

boxplots

<强>更新

在回应下面的评论时,让我们假设您想用另一个列表中的字符串替换现有的图形标题。我倾向于使用foreach来执行与sapply非常相似的任务,但允许您指定多个输入列表。如果您还不熟悉该软件包,请查看Using The foreach Pakage。这是一些示例代码。

## alternate column names
colsList2 <- list(hCols <- paste("h", 1:3, sep = ""),
                  iCols <- paste("i", 1:3, sep = ""),
                  jCols <- paste("j", 1:3, sep = ""),
                  kCols <- paste("k", 1:3, sep = ""),
                  lCols <- paste("l", 1:3, sep = ""),
                  mCols <- paste("m", 1:3, sep = ""),
                  nCols <- paste("n", 1:3, sep = ""))

## create plots
par(mfrow = c(1, 3))

library(foreach)
foreach(x = colsList[[1]], y = colsList2[[1]]) %do%
  boxplotFunct(df[, x], df$group, y)

boxplots2