我想在一个数据框上使用apply函数,但只想对最后的5列应用该函数。
B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, 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
同样没有做到我期望/想要的。
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)
cols <- c("var1", "var2")
。 - cparmstrongwifi[4:9] %<>% map_dbl(A)
。 - Agile Beanmap
是一个不错的选择,但我建议使用%<>%
运算符。请滚动到https://r4ds.had.co.nz/pipes.html的末尾。 - Kay使用一个示例的数据框和示例函数(仅将所有值加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
$
按名称索引某个列,而不是使用 [:]
按列号进行索引?我尝试添加列名:colnames(wifi) = c("a", "b", "c", "d", "e", "f", "g", "h" ,"i")
但是任何尝试使用 lapply(wifi$e, 2, X)
都无法实现。 - santekowifi[c("a","b","c")]
这样的语法通过列名来同时索引多个列。 - thelatemailapply(wifi[4:9],2, A)
中,wifi[4:9]
是一个 data.frame
。而 apply
只能用于数组或矩阵。为什么你的答案可行? - kittygirl使用dplyr
包的across
功能很容易实现此任务。
A <- function(x) x + 1
wifi <- data.frame(replicate(9,1:4))
我们可以通过索引来指定我们希望应用该函数的列,像这样:
library(dplyr)
wifi %>%
mutate(across(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
或者按名称:
wifi %>%
mutate(across(X4:X9, 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)
对于您想要传递给自定义函数的任何其他参数,情况也是如此。
dataFunctionUsed <- data %>%
mutate(columnToUseFunctionOn = function(oldColumn ...))
cbind(y[1:3], ...)
将其与你所得到的结果合并。 - IRTFM