3

我有大约 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朋友。

4

3 回答 3

6

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

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

或者您可以使用scalewhich 在向量上执行此计算。

lapply(data, scale)

您可以直接翻译python样式方法

for(col in names(data)){
   data[[col]] <- scale(data[[col]])
}

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

于 2013-07-11T01:05:38.953 回答
2

我认为你是对的, apply() 可能是这里的方式。

例如:

data <- array(1:20, dim=c(4, 5))

data.zscores <- apply(data, 2, function(x)
    (x-mean(x, na.rm = TRUE))/sd(x, na.rm = TRUE))

函数 apply() 将矩阵或数组作为它的第一个参数。“2”指的是函数迭代的维度——在我们的例子中是列。如果我们想按行执行,我们会选择“1”。最后,我们有了要应用于每一列的函数。请参阅?申请以获取更多详细信息。

于 2013-07-10T20:54:48.377 回答
0

检查一下我遍历数据框以识别 NA 行

for(i in names(houseDF)){
  print(i)
  print(nrow(houseDF[is.na(houseDF[i]),]))
  print("---------------------")
}
于 2017-10-29T13:16:12.837 回答