2

(ヘルプを反映するように編集されています...書式設定はうまくいきませんが、フィードバックに感謝します)

私は、十分に簡単な問題であると思われるものに少しこだわっています。R にロードした複数の異なるデータ セットがあり、それらはすべて異なる数の観測値を持っていますが、すべて「A1」、「A2」、および「A3」という名前の 2 つの変数を持っています。A3にゼロより大きい値が含まれている場合は「A1」に保持されている値を含み、A3にゼロ未満の値が含まれている場合は「A2」に保持されている値を含む3つのデータフレームのそれぞれに新しい変数を作成したいと考えています。単純に思えますよね?

このコードでの私の試みは、この偽のデータを使用しています:

set.seed(1)
A1=seq(1,100,length=100)
A2=seq(-100,-1,length=100)
A3=runif(100,-1,1)
df1=cbind(A1,A2,A3)

A3=runif(100,-1,1)
df2=cbind(A1,A2,A3)

Rには複数のデータフレームで同じ名前の変数を作成する機能があることは約1000パーセント確信していますが、lapplyでこれを試してみました:

mylist=list(df1,df2)
lapply(mylist,function(x){
  x$newVar=x$A1
  x$newVar[x$A3>0]=x$A2[x$A3>0]
  return(x)
})

しかし、ラップリー ループを抜けると、newVar は利用できません。たとえば、新しい変数の平均を求める場合: mean(df1$newVar) [1] NA 警告メッセージ: In mean.default(df1$newVar) : 引数は数値または論理ではありません: NA を返す

どんな助けでも大歓迎です。
ありがとうございました。

4

1 に答える 1

3

まず第一に、行列ではdf1ありdf2ませdata.framesん (ドル構文は行列では機能しません)。
実際、そうする場合:

set.seed(1)
A1=seq(1,100,length=100)
A2=seq(-100,-1,length=100)
A3=runif(100,-1,1)
df1=as.data.frame(cbind(A1,A2,A3))

A3=runif(100,-1,1)
df2=as.data.frame(cbind(A1,A2,A3))

mylist=list(df1,df2)
lapply(mylist,function(x){
  x$newVar=x$A1
  x$newVar[x$A3>0]=x$A2
})

コードはほとんど機能しますが、いくつかの警告が表示されます。実際、 によって呼び出された関数の最後の行にはまだエラーがありますlapply。次のように変更すると、期待どおりに動作します。

lapply(mylist,function(x){
  x$newVar=x$A1
  x$newVar[x$A3>0]=x$A2[x$A3>0] # you need to subset x$A2 otherwise it's too long
  return(x) # better to state explicitly what's the return value
})

編集(コメントによる):

基本的に R で常に発生するように、関数は既存のオブジェクトを変更せず、新しいオブジェクトを返します。
したがって、この場合df1、 とdf2は同じですがlapply、予想される 2 つの新しい data.frames を含むリストを返します。

resultList <- lapply(mylist,function(x){
  x$newVar=x$A1
  x$newVar[x$A3>0]=x$A2[x$A3>0]
  return(x)
})

newDf1 <- resultList[[1]]
newDf2 <- resultList[[2]]
于 2013-08-19T21:26:03.930 に答える