循环遍历数据框和变量名称

时间:2013-05-23 12:31:44

标签: r variables loops dataframe

我正在寻找一种使用FOR循环自动化R中某些图表的方法:

dflist <- c("dataframe1", "dataframe2", "dataframe3", "dataframe4")

for (i in dflist) {
  plot(i$var1, i$var2)
}

所有数据帧都具有相同的变量,即var1,var2。

似乎for循环不是最优雅的解决方案,但我不明白如何将apply函数用于图表。

编辑:

我使用mean()的原始示例在原始问题中没有帮助,因此我将其更改为绘图函数。

5 个答案:

答案 0 :(得分:10)

为了进一步添加Beasterfield的答案,您似乎希望在每个数据帧上执行一些复杂的操作。

可以在apply语句中包含复杂的函数。那么你现在的位置:

for (i in dflist) {
  # Do some complex things
}

这可以翻译为:

lapply(dflist, function(df) {
  # Do some complex operations on each data frame, df
  # More steps

  # Make sure the last thing is NULL. The last statement within the function will be
  # returned to lapply, which will try to combine these as a list across all data frames.
  # You don't actually care about this, you just want to run the function.
  NULL
})

使用情节的更具体的例子:

# Assuming we have a data frame with our points on the x, and y axes,
lapply(dflist, function(df) {
  x2 <- df$x^2
  log_y <- log(df$y)
  plot(x,y)
  NULL
})

您还可以编写带有多个参数的复杂函数:

lapply(dflist, function(df, arg1, arg2) {
  # Do something on each data.frame, df
  # arg1 == 1, arg2 == 2 (see next line)
}, 1, 2) # extra arguments are passed in here

希望这会帮助你!

答案 1 :(得分:6)

关于您的实际问题,您应该了解如何访问data.framematrixlist s的单元格,行和列。从您的代码中我想您想要访问data.frame j的{​​{1}}列,所以它应该是:

i

mean( i[,j] ) # or mean( i[[ j ]] ) 运算符只能在您想要访问data.frame中的特定变量时使用,例如$。此外,它的效率低于i$var1[, ]

的访问权限。

然而,尽管没有错,但[[]]循环使用它并不是很好。您应该阅读有关矢量化函数和for族的信息。因此,您的代码可以轻松地重写为:

apply

答案 2 :(得分:2)

使用@Roland的例子,我想向您展示ggplot2等价物。首先,我们必须稍微改变一下数据集:

首先是原始数据:

> dflist
[[1]]
           x           y
1  0.9148060 -0.10612452
2  0.9370754  1.51152200
3  0.2861395 -0.09465904
4  0.8304476  2.01842371
5  0.6417455 -0.06271410
6  0.5190959  1.30486965
7  0.7365883  2.28664539
8  0.1346666 -1.38886070
9  0.6569923 -0.27878877
10 0.7050648 -0.13332134

[[2]]
            x          y
1   0.6359504 0.33342721
2  -0.2842529 0.34674825
3  -2.6564554 0.39848541
4  -2.4404669 0.78469278
5   1.3201133 0.03893649
6  -0.3066386 0.74879539
7  -1.7813084 0.67727683
8  -0.1719174 0.17126433
9   1.2146747 0.26108796
10  1.8951935 0.51441293

并将数据放入一个带有id列

的data.frame中
require(reshape2)
one_df = melt(dflist, id.vars = c("x","y"))
> one_df
            x           y L1
1   0.9148060 -0.10612452  1
2   0.9370754  1.51152200  1
3   0.2861395 -0.09465904  1
4   0.8304476  2.01842371  1
5   0.6417455 -0.06271410  1
6   0.5190959  1.30486965  1
7   0.7365883  2.28664539  1
8   0.1346666 -1.38886070  1
9   0.6569923 -0.27878877  1
10  0.7050648 -0.13332134  1
11  0.6359504  0.33342721  2
12 -0.2842529  0.34674825  2
13 -2.6564554  0.39848541  2
14 -2.4404669  0.78469278  2
15  1.3201133  0.03893649  2
16 -0.3066386  0.74879539  2
17 -1.7813084  0.67727683  2
18 -0.1719174  0.17126433  2
19  1.2146747  0.26108796  2
20  1.8951935  0.51441293  2

制作情节:

require(ggplot2)
ggplot(one_df, aes(x = x, y = y)) + geom_point() + facet_wrap(~ L1)

enter image description here

答案 3 :(得分:1)

set.seed(42)
dflist <- list(data.frame(x=runif(10),y=rnorm(10)),
               data.frame(x=rnorm(10),y=runif(10)))

par(mfrow=c(1,2))
for (i in dflist) {
  plot(y~x, data=i)
}

答案 4 :(得分:0)

基于Scott Ritchi解决方案,这将是可重现的示例,同时隐藏来自lapply的反馈消息:

# split dataframe by condition on cars hp
f <- function() trunc(signif(mtcars$hp, 2) / 100)
dflist <- lapply(unique(f()), function(x) subset(mtcars, f() == x ))

这会根据mtcars变量分类将hp数据帧拆分为子集(0表示低于100的hp,1表示100的hp,2表示200的pt,依此类推。)

然后将其绘制:

# use invisible to prevent the feedback message from lapply
invisible(
    lapply(dflist, function(df) {
    x2 <- df$mpg^2
    log_y <- log(df$hp)
    plot(x2, log_y)
    NULL
}))

invisible()将阻止lapply()消息:

16 
9 
6 
1 
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

enter image description here