如何自动访问数据框中特定的矩阵变量列?

时间:2013-10-22 18:26:10

标签: r matrix dataframe variable-assignment

我有一个数据框,其中许多变量是矩阵,它们为自己的列共享相似的列名。我想将函数应用于所有变量的特定列。

以下代码是数据样本,并尝试这样做。但是,尝试使用paste()函数生成的名称访问列时出错。

data_all <- data.frame(time=sample(seq(1, 20), 1000, replace=TRUE), A= runif(1000), B= runif(1000))
str(data_all)
data_all_agg <- data.frame(aggregate(list(A = data_all[, 'A']), list(time = data_all[, 'time']), function (x) quantile(x, probs = c(0.2, 0.5, 0.8)) ))
data_all_agg <- cbind(data_all_agg, data.frame(aggregate(list(B = data_all[, 'B']), list(time = data_all[, 'time']), function (x) quantile(x, probs = c(0.2, 0.5, 0.8)) )))
data_all_agg <- data_all_agg[!duplicated(lapply(data_all_agg, summary))]
#
var_names <- c("A", "B")
for (var_name_counter in c(1:2)) {
        get(paste("data_all_agg$", var_names[var_name_counter],"[,\"50%\"]", sep=""))
}

Error in get(paste("data_all_agg$", var_names[var_name_counter], "[,\"50%\"]",  : 
      object 'data_all_agg$A[,"50%"]' not found

如果我直接输入data_all_agg$A[,"50%"],我会得到值:

> data_all_agg$A[,"50%"]
 [1] 0.4620452 0.4874819 0.5084974 0.5524401 0.5282378 0.4586645 0.5726048
 [8] 0.5040240 0.5196544 0.6153615 0.5439682 0.5331080 0.5607132 0.4661196
[15] 0.5572938 0.6014468 0.5490722 0.5181902 0.4968988 0.5233519

此外,对于eval(),它给出的字符串不是值:

for (var_name_counter in c(1:2)) {
        Res <- eval(paste("data_all_agg$", var_names[var_name_counter],"[,\"50%\"]", sep=""))
}

> Res
[1] "data_all_agg$B[,\"50%\"]"

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这样的字符串操作通常不是访问数据的最佳方式。不过,如果你想这样做,一个解决方案是使用evalparse

for (var_name_counter in c(1:2)) {
        Res <- eval(parse(text=paste("data_all_agg$", var_names[var_name_counter],"[,\"50%\"]", sep="")))
}

> Res
 [1] 0.5897688 0.5697550 0.5333134 0.5286540 0.5339315 0.4455871 0.4000211
 [8] 0.5918556 0.2938133 0.5593963 0.5993373 0.5456933 0.5947355 0.4148935
[15] 0.5104526 0.5281240 0.4540751 0.4977381 0.5267636 0.4863866

您需要调用parse的原因是eval需要表达式而不是字符串,而parse将通过解析字符串来返回表达式。有关详细信息,请参阅?eval?parse

然而,在没有任何字符串操作的情况下,做这样的事情似乎更容易:

> var_names <- c("A", "B")
> for (i in c(1:2)) {
+     Res<-data_all_agg[[var_names[i]]][,"50%"]
+     print(Res)
+ }
 [1] 0.3775643 0.5346113 0.4711610 0.4407886 0.4300827 0.5117041 0.4227422
 [8] 0.5120470 0.5584456 0.5376804 0.4205211 0.6027916 0.5384184 0.5976866
[15] 0.6133554 0.4721133 0.5317935 0.5128450 0.5564370 0.5824520
 [1] 0.5897688 0.5697550 0.5333134 0.5286540 0.5339315 0.4455871 0.4000211
 [8] 0.5918556 0.2938133 0.5593963 0.5993373 0.5456933 0.5947355 0.4148935
[15] 0.5104526 0.5281240 0.4540751 0.4977381 0.5267636 0.4863866

答案 1 :(得分:0)

您可能需要使用eval代替get才能评估$[]