为数据帧inR指定列名时出错
我运行以下代码以打开一组CSV文件,其中包含温度和时间数据为数据帧inR指定列名时出错,r,dataframe,R,Dataframe,我运行以下代码以打开一组CSV文件,其中包含温度和时间数据 temp = list.files(pattern="*.csv") for (i in 1:length(temp)) { assign(temp[i], read.csv(temp[i], header=FALSE, skip =20)) colnames(as.data.frame(temp[i])) <- c("Date","Unit","Temp") } 我正在尝试分配列名,但收到以下错误消息: Error
temp = list.files(pattern="*.csv")
for (i in 1:length(temp))
{
assign(temp[i], read.csv(temp[i], header=FALSE, skip =20))
colnames(as.data.frame(temp[i])) <- c("Date","Unit","Temp")
}
我正在尝试分配列名,但收到以下错误消息:
Error in `colnames<-`(`*tmp*`, value = c("Date", "Unit", "Temp")) :
'names' attribute [3] must be the same length as the vector [1]
colnames中的错误我会采取稍微不同的方法,这可能更容易理解:
temp = list.files(pattern="*.csv")
for (i in 1:length(temp))
{
tmp <- read.csv(temp[i], header=FALSE, skip =20)
colnames(tmp) <- c("Date","Unit","Temp")
# Now what do you want to do?
# For instance, use the file name as the name of a list element containing the data?
}
将创建多页pdf。祝你好运 我会采取稍微不同的方法,这可能更容易理解:
temp = list.files(pattern="*.csv")
for (i in 1:length(temp))
{
tmp <- read.csv(temp[i], header=FALSE, skip =20)
colnames(tmp) <- c("Date","Unit","Temp")
# Now what do you want to do?
# For instance, use the file name as the name of a list element containing the data?
}
将创建多页pdf。祝你好运 乍一看,在临时列表的元素周围似乎缺少一组大括号,[]
。您的属性列表有三个元素,但由于您使用的是temp[i]
而不是temp[[i]]
,因此for循环实际上没有访问列表中的元素,因此将其视为长度为1的元素,正如错误所述。乍看之下,似乎缺少一组大括号集,[]
,围绕临时列表中的元素。您的属性列表有三个元素,但由于您使用的是temp[i]
而不是temp[[i]]
for循环实际上没有访问列表中的元素,因此正如错误所说,它被视为长度为1的元素。通常不建议在R中使用'assign'语句。(我真的应该找到一些关于为什么会这样的资源。)
您可以使用以下函数来完成您正在尝试的操作:
V1 V2 V3
1 6/30/13 10:00:01 AM C 32.5
2 6/30/13 10:20:01 AM C 32.5
3 6/30/13 10:40:01 AM C 33.5
4 6/30/13 11:00:01 AM C 34.5
5 6/30/13 11:20:01 AM C 37.0
6 6/30/13 11:40:01 AM C 35.5
read.a.file <- function (f, cnames, ...) {
my.df <- read.csv(f, ...)
colnames(my.df) <- cnames
## Here you can add more preprocessing of your files.
}
通常不建议在R中使用'assign'语句(我应该找到一些关于为什么会这样的参考资料)
您可以使用以下函数来完成您正在尝试的操作:
V1 V2 V3
1 6/30/13 10:00:01 AM C 32.5
2 6/30/13 10:20:01 AM C 32.5
3 6/30/13 10:40:01 AM C 33.5
4 6/30/13 11:00:01 AM C 34.5
5 6/30/13 11:20:01 AM C 37.0
6 6/30/13 11:40:01 AM C 35.5
read.a.file <- function (f, cnames, ...) {
my.df <- read.csv(f, ...)
colnames(my.df) <- cnames
## Here you can add more preprocessing of your files.
}
“read.csv”返回一个data.frame,因此您不需要“as.data.frame”调用
您可以使用“col.names”参数“read.csv”来指定列名
我不知道您使用的是哪个版本的R,但是“colnames(as.data.frame(…)
“read.csv”返回一个data.frame,因此您不需要“as.data.frame”调用
您可以使用“col.names”参数“read.csv”来指定列名
我不知道您使用的是什么版本的R,但是“colnames(as.data.frame(…)下面是解决您的问题的短期方法,但是您确实需要阅读更多关于使用R
的内容,正如您在上面所做的那样,我希望您会很快陷入另一个混乱。可能从从不使用assign
开始
lapply(list.files(pattern = "*.csv"), function (f) {
df = read.csv(f, header = F, skip = 20))
names(df) = c('Date', 'Unit', 'Temp')
df
}) -> your_list_of_data.frames
尽管您更可能希望这样做(编辑以保留文件名信息):
下面是一个短期解决问题的方法,但是你确实需要阅读更多关于使用R
的内容,正如你在上面所做的那样,我预计你会很快陷入另一个困境。也许从永远不要使用assign
开始
lapply(list.files(pattern = "*.csv"), function (f) {
df = read.csv(f, header = F, skip = 20))
names(df) = c('Date', 'Unit', 'Temp')
df
}) -> your_list_of_data.frames
尽管您更可能希望这样做(编辑以保留文件名信息):
在colnames
命令中调用temp[i]
时,看起来temp[i]
引用的是字符对象,而不是您创建的变量!如果我没有记错,那么您必须使用get(temp[i])
调用名为temp[i]的变量
指的是字符对象。当您在colnames
命令中调用temp[i]
时,看起来temp[i]
指的是字符对象,而不是您创建的变量!如果我没有记错,您就必须使用get(temp[i])
调用名为temp[i]的变量
指的是。这不是要通过tmp为他们拥有的每个csv重写吗?我想他们想为每个csv创建一个对象。当然。我假设OP可能想在他们前进的过程中cbind
他们,但我不想试着读懂他们的心思。这很好,谢谢!但是的,我每次都需要创建一个新对象。如何是否使用cbind?我对R非常陌生,不熟悉基本功能,但我认为关键是您希望最终数据的结构如何?因为文件中没有站点信息,我猜您希望使用文件名作为某种标识符,并将所有数据收集到一个大的部分。选择可能取决于您的方式计划绘制此信息。总体而言,我正在尝试上载一组CSV文件,这些文件的数据格式如上所示(跳过是必要的,因为每个文件的前20行只是一个标题),然后覆盖时间与温度的图表,并找到一个基本趋势。因此我认为最好将每个CSV作为其自己的数据帧。这是否回答了您的问题?这不是要通过tmp为他们拥有的每个CSV重写吗?我想他们想为每个CSV创建一个对象。当然。我假设OP可能想要cbind
随他们去,但我不想试着读懂他们的想法。这很好,谢谢!但是,是的,我每次都需要创建一个新对象。cbind是如何使用的?我对R非常陌生,对基本功能仍然不熟悉。我想关键是您希望最终数据的结构如何?因为文件中没有站点信息,我想这意味着您希望使用文件名作为某种标识符,并将所有数据收集到一大块中。选择可能取决于您计划如何绘制此信息。总体而言,我正在尝试上载一组CSV文件,这些文件的数据格式如上所示(跳过是必要的,因为每个文件的前20行只是一个标题),然后覆盖时间与温度的图表,并找到潜在的趋势。因此,我认为最好将每个CSV作为其自己的数据帧。这是否回答了您的问题?list.files应创建一个字符向量而不是list.list.files应创建一个字符向量而不是列表。为了完整性,让我们链接回问题n您刚才问,此处的OP可能会发现有用。为了完整性,让我们回到您刚才问的问题,此处的OP可能会发现有用。
lapply(list.files(pattern = "*.csv"), function (f) {
df = read.csv(f, header = F, skip = 20))
names(df) = c('Date', 'Unit', 'Temp')
df
}) -> your_list_of_data.frames
df = do.call(rbind,
lapply(list.files(pattern = "*.csv"), function(f)
cbind(f, read.csv(f, header = F, skip = 20))))
names(df) = c('Filename', 'Date', 'Unit', 'Temp')