R数据导入&转型

时间:2015-11-25 20:28:18

标签: r regression

我有一个包含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. 是否有更好的方法来生成(x)向量而不是在for-loop中附加?

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

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

  4. 我是R的新手,所以您可以提出的任何改进都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

如果您的数据存储为matrix,而data.frameread.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]]
})

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