【问题标题】:How automatically access a specific column of matrix variables in a data frame?如何自动访问数据框中的特定矩阵变量列?
【发布时间】:2013-10-22 18:26:10
【问题描述】:

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

以下代码是数据示例,并尝试这样做。但是,尝试使用由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%\"]"

有什么想法吗?

【问题讨论】:

    标签: r matrix dataframe variable-assignment


    【解决方案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
    

    【讨论】:

    • 谢谢!我会使用你的第二个建议。
    【解决方案2】:

    您可能需要使用eval 而不是get 来评估$[]s。

    【讨论】:

    • 谢谢。但是,使用 eval(),它会给出一个名称字符串而不是它的值。我将 eval() 示例添加到主要问题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多