在 sapply 的函数参数内循环
Loops within function argument of 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 = ""))
这为我们提供了一个数据集,其中的列按列名的首字母聚类。这类似于我自己的数据集,其中有一份问卷,其中包含在多个时间点(很多时间点)测量的多个项目。该问卷产生了几个因素得分。因此,有几组列代表问卷中测量过多次的每个因素。在这个玩具数据集中,我们可以认为列名中的字母表示哪个因素,数字表示哪个时间点。
我希望能够选择 cluster/factor 我通过 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 = ""))
现在制作箱线图函数。我想根据组为每个聚类因子绘制图。
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 循环中按原样包含另一个循环(即,这更多是为了我对应用族的一般了解而不是如何绘制图形)。
你可以使用
sapply(seq(lengths(colsList)[[1]]), function(x)
boxplotFunct(df[,colsList[[1]][x] ], df$group, colsList[[1]][x]))
即使用索引。
当遍历 colsList[[1]]
而不是 df[, colsList[[1]]]
时,您的 sapply
代码可以大大减少。
sapply(colsList[[1]], function(x) {
boxplotFunct(df[, x], df$group, x)
})
更新:
作为对以下评论的回应,让我们假设您想用另一个列表中的字符串替换现有的图形标题。我倾向于将 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)
我正在尝试使用 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 = ""))
这为我们提供了一个数据集,其中的列按列名的首字母聚类。这类似于我自己的数据集,其中有一份问卷,其中包含在多个时间点(很多时间点)测量的多个项目。该问卷产生了几个因素得分。因此,有几组列代表问卷中测量过多次的每个因素。在这个玩具数据集中,我们可以认为列名中的字母表示哪个因素,数字表示哪个时间点。
我希望能够选择 cluster/factor 我通过 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 = ""))
现在制作箱线图函数。我想根据组为每个聚类因子绘制图。
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 循环中按原样包含另一个循环(即,这更多是为了我对应用族的一般了解而不是如何绘制图形)。
你可以使用
sapply(seq(lengths(colsList)[[1]]), function(x)
boxplotFunct(df[,colsList[[1]][x] ], df$group, colsList[[1]][x]))
即使用索引。
当遍历 colsList[[1]]
而不是 df[, colsList[[1]]]
时,您的 sapply
代码可以大大减少。
sapply(colsList[[1]], function(x) {
boxplotFunct(df[, x], df$group, x)
})
更新:
作为对以下评论的回应,让我们假设您想用另一个列表中的字符串替换现有的图形标题。我倾向于将 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)