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)