在多列上自动执行R中的正常变换函数

时间:2014-01-30 02:04:56

标签: r loops

我有一个数据框m:

>m

id  w   y   z
1   2   5   8
2   18  5   98
3   1   25  5
4   52  25  8
5   5   5   4
6   3   3   5

下面是一个常规函数,用于正常转换我需要应用于列w,y,z的变量。

y<-qnorm((rank(x,na.last="keep")-0.5)/sum(!is.na(x))

例如,如果我想在“列w”上运行此函数以将输出列附加到数据帧“m”,那么:

m$w_n<-qnorm((rank(m$w,na.last="keep")-0.5)/sum(!is.na(m$w))

有人可以帮我自动执行此操作以在数据框m中的多个列上运行吗? 理想情况下,我希望输出数据框具有以下列:

id  w   y   z   w_n  y_n  z_n

请注意,这是一个示例数据框,我拥有的数据框要大得多,而且除了w,y,z之外,我还有更多的字母列来运行此函数。 谢谢!

1 个答案:

答案 0 :(得分:2)

可能只需一步即可完成,但是:

df <- data.frame(id = 1:6, w = sample(50, 6), z = sample(50, 6) )

df
  id  w  z
1  1 39 40
2  2 20 26
3  3 43 11
4  4  4 37
5  5 36 24
6  6 27 14

transCols <- function(x) qnorm((rank(x,na.last="keep")-0.5)/sum(!is.na(x)))
tmpdf <- lapply(df[, -1], transCols)
names(tmpdf) <- paste0(names(tmpdf), "_n")
df_final <- cbind(df, tmpdf)
df_final

df_final
  id  w  z        w_n        z_n
1  1 39 40 -0.2104284 -1.3829941
2  2 20 26  1.3829941  1.3829941
3  3 43 11  0.2104284  0.6744898
4  4  4 37 -1.3829941  0.2104284
5  5 36 24  0.6744898 -0.6744898
6  6 27 14 -0.6744898 -0.2104284