【问题标题】:rdata: Some method to iterate through column names of a data frame?rdata:某种方法来遍历数据框的列名?
【发布时间】:2013-04-12 09:46:25
【问题描述】:

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

【问题讨论】:

标签: r rdata


【解决方案1】:

看看这个 我遍历数据框以识别 NA 行

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

【讨论】:

    【解决方案2】:

    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 中的内存效率不高,因为 [[&lt;.data.frame 每次都会复制整个 data.frame。

    【讨论】:

    • 使用 lapply 返回一个列表以便返回一个数据框:data.frame(lapply(data, scale))
    【解决方案3】:

    我认为你是对的,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”。最后,我们有了要应用于每一列的函数。有关详细信息,请参阅?申请。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-21
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 2016-11-26
      • 1970-01-01
      相关资源
      最近更新 更多