我有一个数据框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之外,我还有更多的字母列来运行此函数。 谢谢!
答案 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