-1

多くの変数が、独自の列に類似した列名を共有する行列であるデータ フレームがあります。すべての変数の特定の列に関数を適用したいと考えています。

次のコードは、データのサンプルとその試みです。ただし、関数によって生成された名前を使用して列にアクセスしようとすると、エラーが発生し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%\"]"

何か案が?

4

2 に答える 2

1

このような文字列操作は、通常、データにアクセスする最良の方法ではありません。それにもかかわらず、この方法で進めたい場合、1 つの解決策はevalandを使用することparseです。

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
于 2013-10-22T18:49:11.377 に答える
0

andを評価するために、おそらくeval代わりに使用する必要があります。get$[]

于 2013-10-22T18:30:53.470 に答える