rdata:迭代数据框列名的一些方法?

时间:2013-04-19 04:23:49

标签: r rdata

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

3 个答案:

答案 0 :(得分:6)

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样式方法directy

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

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

答案 1 :(得分: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”。最后,我们有我们想要应用于每列的功能。请参阅?申请了解更多详情。

答案 2 :(得分:0)

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

int64