37

RI では、次のようなことを頻繁に行っています。

adataframe[adataframe$col==something]<-adataframe[adataframe$col==something)]+1

この方法は、長くて面倒です。
変更しようとしているオブジェクトを参照する方法はありますか?

adataframe[adataframe$col==something]<-$self+1 

?

4

4 に答える 4

34

パッケージdata.tableとその:=演算子を試してください。それは非常に速く、非常に短いです。

DT[col1==something, col2:=col3+1]

最初の部分col1==somethingはサブセットです。ここには何でも入れて、列名を変数のように使用できます。つまり、使用する必要はありません$。次に、2 番目の部分col2:=col3+1で、RHS をそのサブセット内の LHS に割り当てます。ここで、列名を変数のように割り当てることができます。:=参照による代入です。オブジェクトのコピーは取得されないため<-、 、=withinおよびよりも高速ですtransform

また、まもなく v1.8.1 で実装されます。 の構文の最終目標の 1 つはj、と組み合わせることです質問を参照してください:=jby:=

UDPDATE : それは確かに:=2012 年 7 月に (グループによって) リリースされました。

于 2011-10-14T15:14:06.790 に答える
15

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
于 2011-10-14T14:41:17.220 に答える
6

これがあなたにできることです。データフレームがあるとしましょう

df = data.frame(x = 1:10, y = rnorm(10))

そして、すべてを1ずつ増やしたいと考えていますy。これは、次を使用して簡単に行うことができます。transform

df = transform(df, y = y + 1)
于 2011-10-14T14:07:32.557 に答える
6

私は部分的です(おそらくサブセットは行にあります)

ridx <- adataframe$col==something
adataframe[ridx,] <- adataframe[ridx,] + 1

これは、凝った/壊れやすい解析に依存せず、実行される操作について合理的に表現され、冗長すぎません。また、人間がうまく解析できる単位に行を分割する傾向があり、標準的なイディオムを使用することには何か魅力があります。R の語彙と特異性は、すでに私の好みには十分な大きさです。

于 2011-10-14T16:36:13.667 に答える