【问题标题】:R Problems with POSIXlt and mutate within a functionR POSIXlt 的问题和函数内的变异
【发布时间】:2020-09-10 15:35:10
【问题描述】:

我正在处理具有 n 个数据框的项目。在我可以与他们合作之前,需要进行一些处理。 其中一项操作是为每个数据框添加“年”、“月”和“日”列。还获得并保留格式为“yyyy - mm - dd”的列“日期”。

dateiNamen<-dir(path="input_folder",pattern = "merged", all.files = T)

Auswertung<-function(Dateiname){
  setwd("input_folder")
  data<-read.delim(Dateiname, stringsAsFactors = FALSE)
  data$date<-as.Date(data$date)
  data<-subset(data, data$date>"1994-12-31")
  data<-data[,colMeans(is.na(data))<0.15]
  
  Ausgabedatei <- paste0("output_folder",Dateiname, "_bearbeitet",".csv")
  write.table(data, file = Ausgabedatei, row.names = F, col.names = T, sep=",")
  setwd("Project_folder")
}

fun<-lapply(dateiNamen, Auswertung)

这是第一步,它可以正常工作,此后任何这些数据框的“日期”列 (XX$date) 都具有以下结构:

head(XX$date)
[1] "1995-01-01" "1995-01-02" "1995-01-03" "1995-01-04" "1995-01-05" "1995-01-06"

str(XX$date)
 Date[1:9131], format: "1995-01-01" "1995-01-02" "1995-01-03" "1995-01-04" "1995-01-05" "1995-01-06" "1995-01-07" "1995-01-08" "1995-01-09" "1995-01-10" ...

class(XX$date)
[1] "Date"

dput(head(XX$date))
structure(c(9131, 9132, 9133, 9134, 9135, 9136), class = "Date")

现在,我将我的第二个函数应用于数据帧,以在每个数据帧中创建年、月和日的列:

dateiNamen2<-dir(path="output_folder",pattern = "merged", all.files = T)

Spalten<-function(Dateiname){
  setwd("output_folder")
  data<-read.csv(Dateiname,header = TRUE, ";")
  
  
  data<-data%>%
        dplyr::mutate(     year = lubridate::year(date), 
                                 month = lubridate::month(date),
                                 day = lubridate::day(date))
  
  Ausgabedatei <- paste0("output_folder_2",Dateiname, "_bearbeitet",".csv")
  write.table(data, file = Ausgabedatei, row.names = F, col.names = T, sep = ",")
  setwd("Project_folder")
}

fun2<-lapply(dateiNamen2, Spalten)

当我应用此功能时,我收到以下错误:

**Error in as.POSIXlt.default(x, tz=tz(x)): 
dont know how to convert "x" in class ""POSIXlt""**

我无法弄清楚是什么导致了这个问题,因为如果我在单个文件上运行相同的命令,它可以完美运行。 也许你们中的一个人看到了我错过的东西。

是的,这些函数可能会“更漂亮”,但它们是我编写的第一个函数。我会继续努力的! :)

【问题讨论】:

    标签: r dplyr lubridate posixlt


    【解决方案1】:

    你可以试试这个功能吗:

    Spalten<-function(Dateiname){
    
      data <- read.csv2(Dateiname) #.....(1)
      data <- data %>%
                dplyr::mutate(date = as.Date(date),            #.....(2)
                              year = lubridate::year(date), 
                              month = lubridate::month(date),
                              day = lubridate::day(date))
      
      Ausgabedatei <- paste0("output_folder_2/",Dateiname, "_bearbeitet",".csv") #.....(3)
      write.table(data, file = Ausgabedatei, row.names = FALSE, col.names = TRUE, sep = ",")
    }
    
    dateiNamen2 <- list.files(path="output_folder",pattern = "merged", 
                              all.files = TRUE, full.names = TRUE) #.....(4)
    fun2 <- lapply(dateiNamen2, Spalten)
    
    1. 使用read.csv2,因为它有默认的sep = ";",而header对于read.csv函数始终是TRUE
    2. 如果我们没有在 read.csv2 中明确提及该类,我认为日期不会自动读入“Date”类,因此我们最好先将其转换为“Date”类。
    3. 如果"output_folder_2" 是文件夹的名称,它应该有一个"/" 来分隔文件名和文件夹名称。
    4. 使用list.files 而不是dir 来创建带有full.names = TRUE 的文件名,这样它就可以返回文件的完整路径,而我们不必使用setwd
    5. 将您在AuswertungSpalten 函数中所做的事情合并到一个函数中并读取和写入文件一次而不是在每个函数中单独执行不是更好吗?

    【讨论】:

    • 1.好吧,改了。谢谢! 2..我试过你的版本,但我现在收到以下错误“UseMethod中的错误(“mutate_”):没有适用于“mutate_”的方法应用于“Date”类的对象可能是“mutate”不能使用“日期”,这应该是类“日期”,但是如何?3。斜线在那里,我只是忘记在示例中写它。4。谢谢!5。当然,它会更好,但这些是我编写的第一个函数,如果它们能正常工作,我会很高兴。但是,将它们结合起来会减少错误的可能性。
    • Dateiname 是文件名的路径,对吧?并且您正在阅读data 中超过1 列的csv?它应该实际工作。尝试为函数外的一个文件运行它。 data &lt;- read.csv2(dateiNamen2[1])data 中返回什么?
    猜你喜欢
    • 1970-01-01
    • 2015-07-15
    • 2021-09-28
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多