91

データフレームで apply 関数を使用したいのですが、関数を最後の 5 列にのみ適用します。

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)})

これは y のすべての列に A を適用します

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y[4:9], 2, A)})

これは、y の列 4 ~ 9 にのみ A を適用しますが、B の合計リターンは最初の 3 列を取り除きます...私はまだそれらが欲しいのですが、それらに A を適用したくないだけです。

wifi[,1:3]+B 

また、私が期待した/望んでいたことをしません。

4

6 に答える 6

108

lapplyapplyapply は最初に data.frame を配列に強制するため、おそらくここよりも良い選択です。これは、すべての列が同じ型でなければならないことを意味します。コンテキストによっては、これが意図しない結果をもたらす可能性があります。

パターンは次のとおりです。

df[cols] <- lapply(df[cols], FUN)

'cols' ベクトルは、変数名またはインデックスにすることができます。可能な限り名前を使用することを好みます (列の並べ替えに対して堅牢です)。したがって、あなたの場合、これは次のようになります。

wifi[4:9] <- lapply(wifi[4:9], A)

列名の使用例:

wifi <- data.frame(A=1:4, B=runif(4), C=5:8)
wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x)
于 2013-08-29T06:36:24.167 に答える
67

サンプル data.frame とサンプル関数の使用 (すべての値に +1 だけ)

A <- function(x) x + 1
wifi <- data.frame(replicate(9,1:4))
wifi

#  X1 X2 X3 X4 X5 X6 X7 X8 X9
#1  1  1  1  1  1  1  1  1  1
#2  2  2  2  2  2  2  2  2  2
#3  3  3  3  3  3  3  3  3  3
#4  4  4  4  4  4  4  4  4  4

data.frame(wifi[1:3], apply(wifi[4:9],2, A) )
#or
cbind(wifi[1:3], apply(wifi[4:9],2, A) )

#  X1 X2 X3 X4 X5 X6 X7 X8 X9
#1  1  1  1  2  2  2  2  2  2
#2  2  2  2  3  3  3  3  3  3
#3  3  3  3  4  4  4  4  4  4
#4  4  4  4  5  5  5  5  5  5

あるいは:

data.frame(wifi[1:3], lapply(wifi[4:9], A) )
#or
cbind(wifi[1:3], lapply(wifi[4:9], A) )

#  X1 X2 X3 X4 X5 X6 X7 X8 X9
#1  1  1  1  2  2  2  2  2  2
#2  2  2  2  3  3  3  3  3  3
#3  3  3  3  4  4  4  4  4  4
#4  4  4  4  5  5  5  5  5  5
于 2013-08-29T05:56:41.877 に答える