使用 get() 函数 R 更改对象的长度
Change length of an object using the get() function R
我正在编写一个函数来分析我硬盘上一个目录中的 .csv 文件,使用一系列 for 和 while 循环(我知道 for 循环在 R 中不受欢迎,但它们对我来说很有用需要)。
该函数创建多个数据帧,并依次对每个数据帧执行操作,然后覆盖它们并移动到目录中的下一个文件以重复该操作。
到目前为止无法使用的代码部分是从正在分析的数据文件中获取的向量创建矩阵。代码的简化版本如下所示:
data1 <- seq(1, 10, 1)
data2 <- seq(1, 7, 1)
data3 <- seq(1, 5, 1)
n <- max(length(data1), length(data2), length(data3))
k <- c(1, 2, 3)
for(a in k){
if(a == 1){
length(get(paste("data", a, sep = ""))) <- n
data_matrix <- get(paste("data", a, sep = ""))
}else{
while(exists(paste("data", a, sep = ""))){
length(get(paste("data", a, sep = ""))) <- n
data_matrix <- cbind(data_matrix, get(paste("data", a, sep = "")))
}
}
}
我的数据的性质是我的数据集中列的长度随每次数据收集而变化,因此我采用了此 post 中发现的一种技术 deals with using cbind to bind objects of a different length without replication of the data within the smaller objects。
我在尝试实现此代码时遇到的问题是我收到错误消息:
长度错误(get(paste("data", a, sep = ""))) <- n :
赋值目标扩展为非语言对象
我猜问题是函数 get() 不能用于 select 全局环境中的项目并以这种方式修改它们。
您可以使用:
get("x")[1:n]
得到一个名为 "x"
的向量,用 NA
填充到长度 n
。
即:
> x=1:3
> n=10
> get("x")[1:n]
[1] 1 2 3 NA NA NA NA NA NA NA
话虽如此,这是获得所需矩阵的一种更简洁的方法(希望您可以适应您的场景):
> datalist <- list(data1, data2, data3)
> maxlength <- max(lengths(datalist))
> sapply(datalist, function(x) x[1:maxlength] )
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 2
[3,] 3 3 3
[4,] 4 4 4
[5,] 5 5 5
[6,] 6 6 NA
[7,] 7 7 NA
[8,] 8 NA NA
[9,] 9 NA NA
[10,] 10 NA NA
对于那些想使用我正在使用的循环方法(我的循环包含其他错误)查看 的外观的人:
data1 <- seq(1, 10, 1)
data2 <- seq(1, 7, 1)
data3 <- seq(1, 5, 1)
n <- max(length(data1), length(data2), length(data3))
k <- c(1, 2, 3)
for(a in k){
if(a == 1){
data_matrix <- get(paste("data", a, sep = ""))[1:n]
}else{
data_matrix <- cbind(data_matrix, get(paste("data", a, sep = ""))[1:n])
}
}
While 循环是不必要的。我以这种方式编写我的代码,这样我就可以尽可能多地使用它,因为我每天都会获得不同数量的数据集,每个数据集的大小也不同。
我可以对每个数据集使用通用操作,因此我可以编写一个函数来自动整理数据、构建图表和比较数据集,而无需为每个分析编写新命令。
我正在编写一个函数来分析我硬盘上一个目录中的 .csv 文件,使用一系列 for 和 while 循环(我知道 for 循环在 R 中不受欢迎,但它们对我来说很有用需要)。
该函数创建多个数据帧,并依次对每个数据帧执行操作,然后覆盖它们并移动到目录中的下一个文件以重复该操作。
到目前为止无法使用的代码部分是从正在分析的数据文件中获取的向量创建矩阵。代码的简化版本如下所示:
data1 <- seq(1, 10, 1)
data2 <- seq(1, 7, 1)
data3 <- seq(1, 5, 1)
n <- max(length(data1), length(data2), length(data3))
k <- c(1, 2, 3)
for(a in k){
if(a == 1){
length(get(paste("data", a, sep = ""))) <- n
data_matrix <- get(paste("data", a, sep = ""))
}else{
while(exists(paste("data", a, sep = ""))){
length(get(paste("data", a, sep = ""))) <- n
data_matrix <- cbind(data_matrix, get(paste("data", a, sep = "")))
}
}
}
我的数据的性质是我的数据集中列的长度随每次数据收集而变化,因此我采用了此 post 中发现的一种技术 deals with using cbind to bind objects of a different length without replication of the data within the smaller objects。
我在尝试实现此代码时遇到的问题是我收到错误消息:
长度错误(get(paste("data", a, sep = ""))) <- n : 赋值目标扩展为非语言对象
我猜问题是函数 get() 不能用于 select 全局环境中的项目并以这种方式修改它们。
您可以使用:
get("x")[1:n]
得到一个名为 "x"
的向量,用 NA
填充到长度 n
。
即:
> x=1:3
> n=10
> get("x")[1:n]
[1] 1 2 3 NA NA NA NA NA NA NA
话虽如此,这是获得所需矩阵的一种更简洁的方法(希望您可以适应您的场景):
> datalist <- list(data1, data2, data3)
> maxlength <- max(lengths(datalist))
> sapply(datalist, function(x) x[1:maxlength] )
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 2
[3,] 3 3 3
[4,] 4 4 4
[5,] 5 5 5
[6,] 6 6 NA
[7,] 7 7 NA
[8,] 8 NA NA
[9,] 9 NA NA
[10,] 10 NA NA
对于那些想使用我正在使用的循环方法(我的循环包含其他错误)查看
data1 <- seq(1, 10, 1)
data2 <- seq(1, 7, 1)
data3 <- seq(1, 5, 1)
n <- max(length(data1), length(data2), length(data3))
k <- c(1, 2, 3)
for(a in k){
if(a == 1){
data_matrix <- get(paste("data", a, sep = ""))[1:n]
}else{
data_matrix <- cbind(data_matrix, get(paste("data", a, sep = ""))[1:n])
}
}
While 循环是不必要的。我以这种方式编写我的代码,这样我就可以尽可能多地使用它,因为我每天都会获得不同数量的数据集,每个数据集的大小也不同。
我可以对每个数据集使用通用操作,因此我可以编写一个函数来自动整理数据、构建图表和比较数据集,而无需为每个分析编写新命令。