首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在特定的dataframe列上应用()函数

在特定的dataframe列上应用()函数
EN

Stack Overflow用户
提问于 2013-08-29 05:48:39
回答 6查看 258.2K关注 0票数 96

我希望在dataframe上使用apply函数,但只将该函数应用于最后5列。

代码语言:javascript
运行
复制
B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)})

这适用于y的所有列。

代码语言:javascript
运行
复制
B<- by(wifi,(wifi$Room),FUN=function(y){apply(y[4:9], 2, A)})

这仅适用于y的第4-9列,但B条的总返回数从前3列开始.我还是想要,我只是不想把A申请到他们身上。

代码语言:javascript
运行
复制
wifi[,1:3]+B 

也不做我想做的事。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-08-29 05:56:41

使用示例data.frame和示例函数(仅对所有值+1 )

代码语言:javascript
运行
复制
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

甚至:

代码语言:javascript
运行
复制
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
票数 68
EN

Stack Overflow用户

发布于 2013-08-29 06:36:24

在这里,lapply可能是比apply更好的选择,因为apply首先强制您的data.frame到数组,这意味着所有列都必须具有相同的类型。这可能会产生意想不到的后果,这取决于您的上下文。

其模式是:

代码语言:javascript
运行
复制
df[cols] <- lapply(df[cols], FUN)

“cols”向量可以是变量名称或索引。我更喜欢在可能的情况下使用名称(它对列的重新排序非常健壮)。所以在你的例子中,这可能是:

代码语言:javascript
运行
复制
wifi[4:9] <- lapply(wifi[4:9], A)

使用列名的示例:

代码语言:javascript
运行
复制
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)
票数 116
EN

Stack Overflow用户

发布于 2022-01-25 14:26:11

这个任务很容易通过dplyr包的across功能来完成。

借用数据结构由这封电子邮件

代码语言:javascript
运行
复制
A <- function(x) x + 1
wifi <- data.frame(replicate(9,1:4))

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

代码语言:javascript
运行
复制
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

或以姓名:

代码语言:javascript
运行
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18503177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档