我有一个包含相同时间序列数据的文件夹。以下是我的数据示例:
Date Time Letter
2009-09-25 23:56:00 a
2009-09-25 23:57:00 a
2009-09-25 23:58:00 b
2009-09-25 23:59:00 c
2009-09-26 00:00:00 c
2009-09-26 00:00:00 c
2009-09-26 00:00:00 c
2009-09-26 00:00:00 b
2009-09-26 00:00:00 a
我希望将我的功能应用于该文件夹中的所有文件。在此我将使用按日期拆分将每个文件拆分为单独的日期,并将函数应用于这些。然后我用表格返回日期,然后是当天输入的每个字母的数字。所以对于上面的数据,我会回来:
$2009-09-25
a 2
b 1
c 1
$2009-09-26
a 1
b 1
c 3
我的问题是,当我尝试使用接收器将输出定向到文件时,我收到错误“接收器堆栈已满”。
setwd("C:\\User1\\Documents\\Files")
path <- "C:\\User1\\Documents\\Files"
files <- list.files(path = path)
lapply(files,function(files, path){
path <- "C:\\User1\\Documents\\Files"
fp <- file.path(path, files)
df <- read.csv(fp)
#A few more calculations with data here
# Separating data frame into large list of separate days
eachday <- split(df, df$Date)
myfunction <- function(df){
# More calculations with data within function
#Sink output to file
sink(file="testing121.csv", append=TRUE, type = "output", split=FALSE)
return(table(night$Activity))
}
# Apply function over list of days
lapply(eachday, myfunction)
})
如果我在功能中关闭接收器,它也不起作用。有没有更好的方法将我的数据保存到具有每个特定日期和其Letter列的频率的文件?为什么这个下沉错了?
答案 0 :(得分:0)
我认为您希望return
输出到sink
中的当前文件。这不是R的工作方式。
return
向调用函数返回一个值。它不会创建任何输出。你可能想要做的是:
...
sink(file="foo.csv")
print(mydata)
sink()
}
即设置接收器,打印某些东西(进入接收器文件)然后重置接收器。您不关心返回值,因此您不使用return
。
如评论中所述,这不会创建一个正确的.csv
文件(它看起来像控制台输出,[1] 10 20 30
等等),所以你真的需要使用{ {1}}或write.table
并且不使用write.csv
函数。