【问题标题】:R data import & transformationR 数据导入和转换
【发布时间】:2015-11-26 09:18:22
【问题描述】:

我有一个包含 M 行的数据文件,每行包含 N 个空格分隔的十进制值。没有标题行。

每一行包含 N 个不同 {X,Y} 元组的“Y”部分。 “X”部分是“位置”/100。因此,如果一行以“5, 6, 7”开头,那么这些将暗示元组 {0.01, 5}, {0.02, 6}, {0.03, 7}。

对于每一行,我需要计算最小二乘拟合并提取斜率。最终结果应该是一个包含 M 个斜率值的向量 (a)。

这是我目前所拥有的。它可以工作,但速度很慢,而且可能比必要的复杂:

table <- read.table("data.txt", header = FALSE)

x = c()
for (i in 1:length(table)) {
    x <- append(x, 0.01 * i)
}

a = c()
for (i in 1:length(table[,1])) {
    a <- append(a, lm(unlist(table[i,], use.names = FALSE) ~ x)$coefficients[[2]])
}

一些具体问题:

  1. 有没有比在 for 循环中追加更好的方法来生成 (x) 向量?

  2. 我什至需要 (x) 向量,还是有办法将“Y”值的单个向量传递给 lm() 函数并让它从位置推断“X”值?

  3. 有没有一种简单的方法可以将数据导入“向量的向量”而不是 R 的“表”结构?

我是 R 的新手,因此您可以提出任何改进建议。

【问题讨论】:

    标签: r regression


    【解决方案1】:

    如果您的数据存储为matrix,而不是data.frame(这是read.table 返回的内容),则按行操作会容易得多。

    重新创建数据:

    DT <- data.frame(V1 = c(5,7,9), V2 = c(6 , 10 , 8), V3 = c(7,12,4))
    

    (注意table是R中函数的名称,所以你应该避免将它用作变量。我用DT代替)

    DT <- as.matrix(DT) #convert to matrix
    colnames(DT) <- c(1:ncol(DT)) #name your columns 1, 2, 3, ... to the total number of columns.
    

    我们现在可以使用apply(链接中的示例#1)将相同的函数应用于矩阵中的每一行。

    apply(DT, 1, function(a){
      lm(y ~ x, data = data.frame(y = a, x = as.numeric(colnames(DT))/100))$coefficients[[2]]
    })
    

    我们的函数获取行,创建一个两列数据框,其中包含行和我们之前创建的1,2,3, ... / 100colnames 向量,并找到最小二乘拟合。如果你想返回整个 lm 模型,只需取出 $coefficients[[2]] (我留下来复制你上面的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-24
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多