R Apply()函数在特定的数据框列上

我想要在数据框上使用apply函数,但是只将函数应用到最后5列。

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

这将A应用于y的所有列

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

这只适用于A的第4-9列,但B条从前3列的总回报…我仍然希望这些,我只是不希望A适用于他们。

 wifi[,1:3]+B 

也不会做我想要的/想要的。

使用示例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 

lapply可能是比在这里应用更好的select,因为首先将data.frame强制转换为数组,这意味着所有列必须具有相同的types。 根据您的情况,这可能会产生意想不到的后果。

模式是:

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

“cols”向量可以是variables名称或索引。 我更喜欢尽可能使用名称(对列重新sorting是强大的)。 所以在你的情况下,这可能是:

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

使用列名称的示例:

 wifi <- data.frame(A=1:4, B=runif(4), C=5:9) wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x)