我正在R中编写一个函数,除其他外,它基于列名矢量来设置数据帧。我正在尝试利用[.data.frame
的默认行为,如果缺少'j'参数,它将返回所有列。有没有办法通过我的包装函数传递一个缺少的参数?这是一个简单的例子:
fixDataFrames <- function(listOfDataFrames, columns){
lapply(listOfDataFrames, function(x) x[,columns])
}
如果我没有为列指定值,则在将其传递给[
函数时会出错:“columns参数缺失,没有默认值”。
答案 0 :(得分:6)
您可以为列设置默认值,这样如果没有提供任何内容,它会抓取所有列。使用TRUE应该工作
fixDataFrames <- function(listOfDataFrames, columns = TRUE){
lapply(listOfDataFrames, function(x) x[,columns])
}
# As Chase points out it is probably more prudent to add drop=FALSE as a parameter
fixDataFrames <- function(listOfDataFrames, columns = TRUE, drop = FALSE){
lapply(listOfDataFrames, function(x) x[, columns, drop = drop])
}
答案 1 :(得分:2)
略有不同的方法是没有匿名功能并直接调用[
。
fixDataFrames <- function(listOfDataFrames, columns = TRUE, drop = TRUE){
lapply(listOfDataFrames, `[`, , j = columns, drop = drop)
}
请注意,两个,
之间的空格重要,因为它代表i
行索引的空间。通过留下这个缺失,我们得到与df[ , columns]
相同的行为。我还设置drop = TRUE
,因为这是[
的默认设置,因此乐趣可以保持行为。
使用来自@ Chase答案的相同数据:
## Sample data
df1 <- df2 <- data.frame(x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10))
listOfDataFrames <- list(df1, df2)
fixDataFrames(listOfDataFrames)
fixDataFrames(listOfDataFrames, 2)
fixDataFrames(listOfDataFrames, 2, drop = FALSE)
给予
> fixDataFrames(listOfDataFrames)
[[1]]
x1 x2 x3
1 -1.98347150 -0.50473182 0.56554491
2 -0.19597580 0.41004825 -0.35646296
3 0.81792146 -0.07646175 -2.02534426
4 -0.01903514 0.70687248 -0.25373188
5 -0.49233958 0.42497338 -0.15647100
6 0.62296268 1.88127659 0.41952414
7 -0.27260248 -2.59046602 -1.99294060
8 1.46344557 1.44803287 0.08634971
9 0.62207040 1.78290849 -0.17131320
10 -1.05730518 -0.45478467 1.15346862
[[2]]
x1 x2 x3
1 -1.98347150 -0.50473182 0.56554491
2 -0.19597580 0.41004825 -0.35646296
3 0.81792146 -0.07646175 -2.02534426
4 -0.01903514 0.70687248 -0.25373188
5 -0.49233958 0.42497338 -0.15647100
6 0.62296268 1.88127659 0.41952414
7 -0.27260248 -2.59046602 -1.99294060
8 1.46344557 1.44803287 0.08634971
9 0.62207040 1.78290849 -0.17131320
10 -1.05730518 -0.45478467 1.15346862
> fixDataFrames(listOfDataFrames, 2)
[[1]]
[1] -0.50473182 0.41004825 -0.07646175 0.70687248 0.42497338 1.88127659
[7] -2.59046602 1.44803287 1.78290849 -0.45478467
[[2]]
[1] -0.50473182 0.41004825 -0.07646175 0.70687248 0.42497338 1.88127659
[7] -2.59046602 1.44803287 1.78290849 -0.45478467
> fixDataFrames(listOfDataFrames, 2, drop = FALSE)
[[1]]
x2
1 -0.50473182
2 0.41004825
3 -0.07646175
4 0.70687248
5 0.42497338
6 1.88127659
7 -2.59046602
8 1.44803287
9 1.78290849
10 -0.45478467
[[2]]
x2
1 -0.50473182
2 0.41004825
3 -0.07646175
4 0.70687248
5 0.42497338
6 1.88127659
7 -2.59046602
8 1.44803287
9 1.78290849
10 -0.45478467
答案 2 :(得分:1)
这似乎是一个黑客攻击,但将第二个参数设置为...
可以实现此行为:
#Sample data
df1 <- df2 <- data.frame(x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10))
listOfDataFrames <- list(df1, df2)
fixDataFrames <- function(listOfDataFrames, ...){
lapply(listOfDataFrames, function(x) x[,...])
}
> fixDataFrames(listOfDataFrames)
[[1]]
x1 x2 x3
1 -1.7475354 -1.3444461 0.2049100
2 0.1451163 1.4396253 0.5885829
...
[[2]]
x1 x2 x3
1 -1.7475354 -1.3444461 0.2049100
2 0.1451163 1.4396253 0.5885829
您可能还想添加, drop = FALSE
,以防止在选择单个列时将data.frame强制转换为向量。
答案 3 :(得分:0)
这是未经测试但请尝试:
fixDataFrames <- function(listOfDataFrames, columns){
lapply(listOfDataFrames, function(x)
if (missing(columns)) {
columns <- 1:ncol(x)
}
x[,columns]
)
}