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() として記述された多くの関数を目にします。
これについて私を助けることができるコメントに心から感謝します