6

plyr パッケージの ddply を使用して関数をデータフレームに適用しようとしていますが、理解できない結果が得られます。結果について3つの質問があります

与えられた:

mydf<- data.frame(c(12,34,9,3,22,55),c(1,2,1,1,2,2)
                  , c(0,1,2,1,1,2))
colnames(mydf)[1] <- 'n'
colnames(mydf)[2] <- 'x'
colnames(mydf)[3] <- 'x1'

mydf は次のようになります。

   n x x1
1 12 1  0
2 34 2  1
3  9 1  2
4  3 1  1
5 22 2  1
6 55 2  2

質問1

私が行った場合:

k <- function(x) {
  mydf$z <- ifelse(x == 1, 0, mydf$n)
  return (mydf)
}
mydf <- ddply(mydf, c("x") , .fun = k, .inform = TRUE)

次のエラーが表示されます。

Error in `$<-.data.frame`(`*tmp*`, "z", value = structure(c(12, 34, 9,  : 
  replacement has 3 rows, data has 6
Error: with piece 1: 
   n x x1
1 12 1  0
2  9 1  2
3  3 1  1

分割する変数を c("x")、"x"、または .(x) のいずれとして指定しても、このエラーが発生します。このエラー メッセージが表示される理由がわかりません。

質問2

しかし、私が本当にやりたいのは、if/else 関数を設定することです。これは、データセットに変数 x1、x2、x3、および x4 があり、それらの変数も考慮したいからです。しかし、次のような簡単なことをしようとすると:

j <- function(x) {
  if(x == 1){
    mydf$z <- 0
  } else {
    mydf$z <- mydf$n
  }
  return(mydf)
  }

mydf <- ddply(mydf, x, .fun = j, .inform = TRUE)

私は得る:

Warning messages:
1: In if (x == 1) { :
  the condition has length > 1 and only the first element will be used
2: In if (x == 1) { :
  the condition has length > 1 and only the first element will be used

質問#3

function() を使用することと、function(x) をいつ使用するかについて混乱しています。j() または k() に function() を使用すると、別のエラーが発生します。

Error in .fun(piece, ...) : unused argument (piece)
Error: with piece 1: 
    n x x1  z
1  12 1  0 12
2   9 1  2  9
3   3 1  1  3
4  12 1  0 12
5   9 1  2  9
6   3 1  1  3
7  12 1  0 12
8   9 1  2  9
9   3 1  1  3
10 12 1  0 12
11  9 1  2  9
12  3 1  1  3

列 z が正しくありません。それでも、function() として記述された多くの関数を目にします。

これについて私を助けることができるコメントに心から感謝します

4

1 に答える 1

11

ここで説明しなければならないことがたくさんあります。最も単純なケースから始めましょう。最初の例では、必要なのは次のとおりです。

mydf$z <- with(mydf,ifelse(x == 1,0,n))

同等のddplyソリューションは次のようになります。

ddply(mydf,.(x),transform,z = ifelse(x == 1,0,n))

おそらく、混乱の最大の原因は、 内の関数に引数として渡されているものを理解していないように見えることですddply

あなたの最初の試みを考えてみましょう:

k <- function(x) {
  mydf$z <- ifelse(x == 1, 0, mydf$n)
  return (mydf)
}

仕組みは、列の値に基づいて、いくつかの小さなデータ フレームにddply分割されることです。つまり、 を呼び出すたびに、 に渡される引数はデータ フレームです。具体的には、プライマリ データ フレームのサブセットです。mydfxddplykk

したがって、 内kxのサブセットでありmydf、すべての列があります。mydf内から変更しようとしないでくださいk。を変更xし、変更されたバージョンを返します。k(必要に応じて、上記のオプションの方が優れています。) したがって、次のように書き直すことができます。

k <- function(x) {
  x$z <- ifelse(x$x == 1, 0, x$n)
  return (x)
}

xを引数としてk また列の 1 つの名前として使用することで、紛らわしいものを作成したことに注意してください。

于 2013-08-29T21:10:49.750 に答える