0

我想使用 sapply() 从我的数据框中的每个变量中制作 qqnorm 图。这是我到目前为止所得到的:

myfun=function(x) {
  c(qqnorm(x),
    qqline(x)
  )
}

sapply(mydata, myfun)

它有效,但是,我希望每个情节在情节标题中都有各自的变量名称。这是怎么做到的?

非常感谢 ;-)

4

3 回答 3

1

在这种情况下l_ply更合适,因为您只需要绘图,因此不需要输出。基于@Henrik的回答,我们有

require(plyr)
myfun <- function(x, data, ...) {
  c(qqnorm(data[[x]], main = names(data)[x], ...),
    qqline(data[[x]])
  )
}

l_ply(seq_len(ncol(swiss)), myfun, data = swiss)

编辑

如果你想看你的图表,你有很多选择,其中之一就是划分你的绘图设备,并在设备的一个部分绘制每个 qqplot。

par(mfrow = c(3, 2))
l_ply(seq_len(ncol(swiss)), myfun, data = swiss)
于 2013-05-24T08:34:59.827 回答
0

问题是,当您这样做时,names不会将其传递给函数,而只会传递给未命名的列表元素。您需要稍微更改函数并只交出索引,然后处理整个对象(即,隐式执行 for 循环并使用迭代器):

data(swiss)

myfun=function(x, data) {
  c(qqnorm(data[[x]], main = colnames(data)[x]),
    qqline(data[[x]])
  )
}

lapply(1:ncol(swiss), myfun, data = swiss)

另外,我将函数更改为lapply并使用swiss数据集作为示例。

于 2013-05-24T08:05:16.620 回答
0

这是一个for循环,恕我直言,这是最合适的循环结构。

for (i in seq_along(swiss)) {
  qqnorm(swiss[,i], main = names(swiss)[i])
  qqline(swiss[,i])
  Sys.sleep(3) #to see something and avoid problems in RStudio
}
于 2013-05-24T09:19:02.457 回答