RI では、次のようなことを頻繁に行っています。
adataframe[adataframe$col==something]<-adataframe[adataframe$col==something)]+1
この方法は、長くて面倒です。
変更しようとしているオブジェクトを参照する方法はありますか?
adataframe[adataframe$col==something]<-$self+1
?
RI では、次のようなことを頻繁に行っています。
adataframe[adataframe$col==something]<-adataframe[adataframe$col==something)]+1
この方法は、長くて面倒です。
変更しようとしているオブジェクトを参照する方法はありますか?
adataframe[adataframe$col==something]<-$self+1
?
パッケージdata.tableとその:=
演算子を試してください。それは非常に速く、非常に短いです。
DT[col1==something, col2:=col3+1]
最初の部分col1==something
はサブセットです。ここには何でも入れて、列名を変数のように使用できます。つまり、使用する必要はありません$
。次に、2 番目の部分col2:=col3+1
で、RHS をそのサブセット内の LHS に割り当てます。ここで、列名を変数のように割り当てることができます。:=
参照による代入です。オブジェクトのコピーは取得されないため<-
、 、=
、within
およびよりも高速ですtransform
。
また、まもなく v1.8.1 で実装されます。 の構文の最終目標の 1 つはj
、と組み合わせることです。質問を参照してください。:=
j
by
:=
UDPDATE : それは確かに:=
2012 年 7 月に (グループによって) リリースされました。
Gabor Grothendeick にもっと注意を払う必要があります (この場合だけではありません) inc
。Matt Asher のブログで引用されている関数は、あなたが求めているすべてのことを行います。
(そして、明らかな拡張子も同様に機能します。)
add <- function(x, inc=1) {
eval.parent(substitute(x <- x + inc))
}
# Testing the `inc` function behavior
編集: 最初のコメントで承認が得られなかったことに一時的に腹を立てた後、関数の引数をさらに追加することに挑戦しました。データフレームの一部の引数を 1 つ指定しても、値の範囲は 1 ずつ増加します。この時点まで、中置 2 項演算子で非常に軽くテストされただけですが、2 つの引数のみを受け入れる関数で動作しない理由はわかりません。
transfn <- function(x, func="+", inc=1) {
eval.parent(substitute(x <- do.call(func, list(x , inc)))) }
(有罪の自白: これは代入のために値を返すという従来の R の観点からは、どういうわけか「間違っているように感じます」。)inc
関数の以前のテストは以下のとおりです。
df <- data.frame(a1 =1:10, a2=21:30, b=1:2)
inc <- function(x) {
eval.parent(substitute(x <- x + 1))
}
#---- examples===============>
> inc(df$a1) # works on whole columns
> df
a1 a2 b
1 2 21 1
2 3 22 2
3 4 23 1
4 5 24 2
5 6 25 1
6 7 26 2
7 8 27 1
8 9 28 2
9 10 29 1
10 11 30 2
> inc(df$a1[df$a1>5]) # testing on a restricted range of one column
> df
a1 a2 b
1 2 21 1
2 3 22 2
3 4 23 1
4 5 24 2
5 7 25 1
6 8 26 2
7 9 27 1
8 10 28 2
9 11 29 1
10 12 30 2
> inc(df[ df$a1>5, ]) #testing on a range of rows for all columns being transformed
> df
a1 a2 b
1 2 21 1
2 3 22 2
3 4 23 1
4 5 24 2
5 8 26 2
6 9 27 3
7 10 28 2
8 11 29 3
9 12 30 2
10 13 31 3
# and even in selected rows and grepped names of columns meeting a criterion
> inc(df[ df$a1 <= 3, grep("a", names(df)) ])
> df
a1 a2 b
1 3 22 1
2 4 23 2
3 4 23 1
4 5 24 2
5 8 26 2
6 9 27 3
7 10 28 2
8 11 29 3
9 12 30 2
10 13 31 3
これがあなたにできることです。データフレームがあるとしましょう
df = data.frame(x = 1:10, y = rnorm(10))
そして、すべてを1ずつ増やしたいと考えていますy
。これは、次を使用して簡単に行うことができます。transform
df = transform(df, y = y + 1)
私は部分的です(おそらくサブセットは行にあります)
ridx <- adataframe$col==something
adataframe[ridx,] <- adataframe[ridx,] + 1
これは、凝った/壊れやすい解析に依存せず、実行される操作について合理的に表現され、冗長すぎません。また、人間がうまく解析できる単位に行を分割する傾向があり、標準的なイディオムを使用することには何か魅力があります。R の語彙と特異性は、すでに私の好みには十分な大きさです。