[英]R Apply() function on specific dataframe columns
我想在数据框上使用 apply 函数,但只将该函数应用于最后 5 列。
B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)})
lapply
可能是比apply
更好的选择,因为 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:8)
wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x)
使用示例 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
如前所述,您只需要将标准 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.rm
是A()
的参数,它可能应该是。 我们可以通过na.rm=T
从计算中删除 NA 值,如下所示:
wifi[,4:9] <- apply(wifi[,4:9], MARGIN=2, FUN=A, na.rm=T)
对于要传递给自定义函数的任何其他参数也是如此。
最简单的方法是使用 mutate 函数:
dataFunctionUsed <- data %>%
mutate(columnToUseFunctionOn = function(oldColumn ...))
使用
dplyr<\/code>包的
across<\/code>功能可以轻松完成此任务。
A <- function(x) x + 1
wifi <- data.frame(replicate(9,1:4))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.