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

skm*_*hur 66 r apply dataframe

我想在数据帧上使用apply函数,但只将函数应用于最后5列.

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)})
Run Code Online (Sandbox Code Playgroud)

这将A应用于y的所有列

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

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

wifi[,1:3]+B 
Run Code Online (Sandbox Code Playgroud)

也没有做我期望/想要的.

lei*_*eif 74

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

模式是:

df[cols] <- lapply(df[cols], FUN)
Run Code Online (Sandbox Code Playgroud)

'cols'向量可以是变量名称或索引.我希望尽可能使用名称(它对列重新排序很有用).所以在你的情况下,这可能是:

wifi[4:9] <- lapply(wifi[4:9], A)
Run Code Online (Sandbox Code Playgroud)

使用列名称的示例:

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)
Run Code Online (Sandbox Code Playgroud)

  • 一个小的修正:wifi < - data.frame(A = 1:4,B = runif(4),C = 5:8) (2认同)

the*_*ail 52

使用示例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
Run Code Online (Sandbox Code Playgroud)

甚至:

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
Run Code Online (Sandbox Code Playgroud)

  • @skotturi - 你可以这样做`wifi [c("a","b","c")]`来按名称索引多个列. (7认同)

Ian*_*ell 6

dplyr使用该包的功能可以轻松完成此任务across

借用thelatemail 建议的数据结构:

A <- function(x) x + 1
wifi <- data.frame(replicate(9,1:4))
Run Code Online (Sandbox Code Playgroud)

我们可以通过索引指示我们希望将函数应用到的列,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

或者按名称:

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
Run Code Online (Sandbox Code Playgroud)