如何迭代数据框的列名?

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语言的朋友们。


你想看一下 colMeans这个问题 - Thomas
3个回答

6

data.frame是一个列表,因此您可以使用lapply。不要在data.frame上使用apply,因为这会强制转换为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每次都会复制整个数据框。

使用lapply返回了一个列表,所以要将其转换为数据框:data.frame(lapply(data, scale)) - Lem Ko

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"。最后,我们需要指定要应用于每一列的函数。更多详情请参见?apply。


0

看这个 我通过迭代数据框来识别NA行

for(i in names(houseDF)){
  print(i)
  print(nrow(houseDF[is.na(houseDF[i]),]))
  print("---------------------")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接