R Apply()函数用于特定的数据帧列

时间:2013-08-29 05:48:39

标签: r dataframe 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)})

这仅适用于y的第4-9列,但是B的总返回从前3列开始......我仍然想要那些,我只是不希望A应用于它们。

wifi[,1:3]+B 

也没有达到我的预期/想要的效果。

4 个答案:

答案 0 :(得分:64)

lapply可能是比apply更好的选择,因为应用首先将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:9)
wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x)

答案 1 :(得分:51)

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

答案 2 :(得分:0)

我认为您想要的是mapply.您可以将该功能应用于所有列,然后只删除您不想要的列。但是,如果要将不同的函数应用于不同的列,则dplyr包中似乎可能是mutate

答案 3 :(得分:0)

如上所述,您只需要将标准R apply函数应用于列(MARGIN=2):

wifi[,4:9] <- apply(wifi[,4:9], MARGIN=2, FUN=A)

或简称:

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

使用A()函数就地更新列4:9。现在,让我们假设na.rmA()的一个参数,它应该是它。我们可以通过na.rm=T从计算中删除NA值,如下所示:

wifi[,4:9] <- apply(wifi[,4:9], MARGIN=2, FUN=A, na.rm=T)

对于要传递给自定义函数的任何其他参数也是如此。