2

これは私の拙い言葉遣いの前の質問の言い直しです。(それに返信してくれた人には、あなたの努力に感謝します。私の質問が明確である必要があったため、申し訳ありません。) 私は大規模なデータセットを持っており、そのサブセットは次のようになります。

a<-c(1,2,3,4,5,1)
b<-c("a","b","a","b","c","a")
c<-c("m","f","f","m","m","f")
d<-1:6
e<-data.frame(a,b,c,d)

特定の条件に基づいて 4 列目のエントリの合計が必要な場合は、次のようにすることができます。

attach(e)
total<-sum(e[which(a==3 & b=="a"),4])
detach(e)

ただし、条件の「ベクトル」(condition_vector と呼びます) があり、その最初の 4 つの要素は次のようになります。

a==3 & b == "a"
a==2
a==1 & b=="a" & c=="m"
c=="f"

条件の condition_vector を読み込んで合計の results_vector を生成する、上記の「合計」式の「一般化された」バージョンを作成したいと思います。この例では、results_vector の最初の 4 つのエントリは、概念的に次のように計算されます。

results_vector[1]<-sum(e[which(a==3 & b=="a"),4])
results_vector[2]<-sum(e[which(a==2),4])
results_vector[3]<-sum(e[which(a==1 & b=="a" & c=="m"),4])
results_vector[4]<-sum(e[which(c=="f"),4])

実際のデータ セットには 20 を超える変数があります。そのため、condition_vector の各レコードには、1 から 20 を超える条件を含めることができます (この例では 1 から 3 の条件が使用されています)。

parse(eval(text= ... アプローチ(比較的小さなデータセットで実行するには長い時間がかかります)を使用する以外に、これを達成する方法はありますか?

提供できるヘルプに事前に感謝します(また、前回ほど明確ではなかったことをお詫びします)。

スパーク

4

2 に答える 2

3

ここでは、明らかに遅いと感じたとしても、ここを使用したソリューションを使用してeval(parse(text=..)います。

cond <- c('a==3 & b == "a"','a==2','a==1 & b=="a" & c=="x"','c=="f"')
names(cond) <- cond
results_vector <- lapply(cond,function(x)
                              sum(dat[eval(parse(text=x)),"d"]))

$`a==3 & b == "a"`
[1] 3

$`a==2`
[1] 2

$`a==1 & b=="a" & c=="m"`
[1] 1

$`c=="f"`
[1] 11

条件ベクトルに名前を付ける利点は、条件によって結果にアクセスできることです。

results_vector[cond[2]]
 $`a==2`
  [1] 2
于 2013-10-12T08:28:47.670 に答える