4

多数の変数を持つデータフレームがあります。古い変数をいくつか追加して、新しい変数を作成しています。私がそうするために使用しているコードは次のとおりです。

name_of_data_frame<- transform(name_of_data_frame, new_variable=var1+var2 +....)

変換が観測値の1つでNAに遭遇すると、追加していた他の変数の一部がNAでなかったとしても、新しい変数で「NA」を返します。

たとえば、、、、の場合var1= 4var2=3var3=NA使用するtransformと、var1+var2+var3それが与えられNAますが、私は7を与えたいと思います。

NA後でsを参照し直す必要があるかもしれないので、データフレーム内でsをゼロに再コード化したくないので、 sを純粋にであった観測とNA混同したくない。NA0

NA変換関数を使用して上記の方法でRを処理する方法についてのヘルプは素晴らしいでしょう(または、使用する代替関数がある場合は、それも素晴らしいでしょう)。

私は常に隣り合っている変数を合計するだけでなく、変数を除算したり、乗算したり、減算したりすることもよくあることに注意してください。

4

2 に答える 2

10

私の最初の本能は、引数sum()を使用できるので、使用することを提案することでした。na.rmただし、sum()引数をベクトルではなく単一のスカラー値に減らすため、これは機能しません。

これは、関数を記述する必要があることを意味しますparallel sum。R の基本関数orpsum()と同様に、this と呼びましょう:pmin()pmax()

psum <- function(..., na.rm=FALSE) { 
  x <- list(...)
  rowSums(matrix(unlist(x), ncol=length(x)), na.rm=na.rm)
} 

いくつかのデータを設定しpsum()、目的のベクトルを取得するために使用します。

dat <- data.frame(
  x = c(1,2,3, NA),
  y = c(NA, 4, 5, NA))

transform(dat, new=psum(x, y, na.rm=TRUE))
   x  y new
1  1 NA   1
2  2  4   6
3  3  5   8
4 NA NA   0

parallel product同様に、 、またはpprod()次のように定義できます。

pprod <- function(..., na.rm=FALSE) { 
  x <- list(...)
  m <- matrix(unlist(x), ncol=length(x))
  apply(m, 1, prod, na.rm=TRUE)
} 

transform(dat, new=pprod(x, y, na.rm=TRUE))
   x  y new
1  1 NA   1
2  2  4   8
3  3  5  15
4 NA NA   1

この の例はpprod、実行したいことの一般的なテンプレートを提供しますapply()。入力の行列を目的のベクトルに要約するために を使用する関数を作成します。

于 2012-08-27T10:33:37.303 に答える
2

とを使用するrowSumsと、prodあなたを助けることができます。

set.seed(007) # Generating some data
DF <- data.frame(V1=sample(c(50,NA,36,24,80, NA), 15, replace=TRUE),
                 V2=sample(c(70,40,NA,25,100, NA), 15, replace=TRUE),
                 V3=sample(c(20,26,34,15,78,40), 15, replace=TRUE))

transform(DF, Sum=rowSums(DF, na.rm=TRUE)) # Sum (a vector of values)
transform(DF, Prod=apply(DF, 1, FUN=prod, na.rm=TRUE)) # Prod (a vector of values)

# Defining a function for substracting (resta, in spanish :D)
resta <- function(x) Reduce(function(a,b) a-b,  x <- x[!is.na(x)])
transform(DF, Substracting=apply(DF, 1, resta))

# Defining a function for dividing 
div <- function(x) Reduce(function(a,b) a/b,  x <- x[!is.na(x)])
transform(DF, Divsion=apply(DF, 1, div))
于 2012-08-27T11:10:18.090 に答える