我有一个包含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]])
}
一些具体问题:
是否有更好的方法来生成(x)向量而不是在for-loop中附加?
我是否需要(x)向量,或者有没有办法将lm()函数传递给“Y”值的单个向量并让它从位置推断出“X”值?
有没有一种简单的方法可以将数据导入“向量矢量”而不是R的“表”结构?
我是R的新手,所以您可以提出的任何改进都将受到高度赞赏。
答案 0 :(得分:0)
如果您的数据存储为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]]
})
我们的函数获取行,创建一个两列数据框,其中包含行和前面创建的colnames
向量1,2,3, ... / 100
,并找到最小二乘拟合。如果您想要退回整个lm
模型,只需取出$coefficients[[2]]
(我留下来复制上面的代码。