我想贬低R中的多个列data.frame.使用这个问题的一个例子
set.seed(999)
library(plyr)
library(plm)
# random data.frame
dat <- expand.grid(id=factor(1:3), cluster=factor(1:6))
dat <- cbind(dat, x=runif(18), y=runif(18, 2, 5))
#demean x and y
dat.2 <- ddply(dat, .(cluster), transform, x=x-mean(x), y=y-mean(y))
Run Code Online (Sandbox Code Playgroud)
我的问题是我有(很多)超过2个变量,我想避免硬编码这个分析.我plyr一般都是新手; 为什么这样呢
dat.2 <- ddply(dat[,c(x,y)], .(cluster), transform, function(x) x - mean(x))
Run Code Online (Sandbox Code Playgroud)
不行?我缺少一些关键步骤吗?有没有更好的方法来做到这一点?
看看colwise仿函数.唯一需要注意的是该id列.因此:
demean <- colwise(function(x) if(is.numeric(x)) x - mean(x) else x)
dat.2 <- ddply(dat, .(cluster), demean)
Run Code Online (Sandbox Code Playgroud)
编辑:正如您所发现的,甚至还有一个numcolwise仅用于处理数字的仿函数,因此您可以:
demean <- numcolwise(function(x) x - mean(x))
dat.2 <- ddply(dat, .(cluster), demean)
Run Code Online (Sandbox Code Playgroud)
您也可以使用该scale函数而不是定义自己的函数:
dat.2 <- ddply(dat, .(cluster), numcolwise(scale, scale = FALSE))
Run Code Online (Sandbox Code Playgroud)