我有大约 30 行代码可以做到这一点(获得 Z 分数):

data$z_col1 <- (data$col1 - mean(data$col1, na.rm = TRUE)) / sd(data$col1, na.rm = TRUE)
data$z_col2 <- (data$col2 - mean(data$col2, na.rm = TRUE)) / sd(data$col2, na.rm = TRUE)
data$z_col3 <- (data$col3 - mean(data$col3, na.rm = TRUE)) / sd(data$col3, na.rm = TRUE)
data$z_col4 <- (data$col4 - mean(data$col4, na.rm = TRUE)) / sd(data$col4, na.rm = TRUE)
data$z_col5 <- (data$col5 - mean(data$col5, na.rm = TRUE)) / sd(data$col5, na.rm = TRUE)

有什么方法,也许使用 apply() 或其他东西,我基本上可以做(python):
for col in ['col1', 'col2', 'col3']:
    data{col} = ... z score code here

谢谢R friend 。

最佳答案

data.frame 是一个列表,因此您可以使用 lapply 。不要在 apply 上使用 data.frame ,因为这会强制转换为 matrix

lapply(data, function(x) (x - mean(x,na.rm = TRUE))/sd(x, na.rm = TRUE))

或者您可以使用 scale 对向量执行此计算。
lapply(data, scale)

你可以直接翻译 python 风格的方法
for(col in names(data)){
   data[[col]] <- scale(data[[col]])
}

请注意,这种方法在 R 中的内存效率不高,因为 [[<.data.frame 每次都会复制整个 data.frame。

关于rdata:遍历数据框列名的一些方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16097172/

10-11 23:04
查看更多