R:写入更改类型表列的函数

时间:2016-03-17 16:37:12

标签: r csv

假设您有几个CSV表,例如

Foo Date1 Date2
bar 2010-03-05 2023-09-09
...
[table1]

Foobar Date
baz 2042-01-01
[table2]

使用read.csv解析这些表后,我想将包含Dates的colulumns转换为内部日期类型。

可以用

做到这一点
table1$Date1 <- as.Date(table1$Date1, "%Y-%m-%d")
table1$Date2 <- as.Date(table1$Date2, "%Y-%m-%d")
table2$Date <- as.Date(table2$Date, "%Y-%m-%d")

但是这会产生大量的冗余代码,所以我想编写一个函数,它接受一个表和一个可变数量的列并重新排列表。只是方便的东西:

convertDate(table1, Date1, Date2)
convertDate(table2, Date)

但是如何定义convertDate?

我已经尝试过(在一个简单的单一论证中)......像:

convertDate <- function(table, column) {
  table[[column]] <- as.Date(table[[column]], "%Y-%m-%d")
}

但这不起作用,因为R显然是按值传递表参数而不是通过引用...

解决这个问题最像R的方式是什么?

由于

2 个答案:

答案 0 :(得分:1)

您必须传递列名列表并对其进行迭代。我在下面附上示例代码。

convertDate <- function(table, columns) {
  for (column in columns){
    table[[column]] <- as.Date(table[[column]], "%Y-%m-%d")
  }
  return(table)
}
table2 = data.frame(Date='2042-01-01')
class(table2$Date)
table2 = convertDate(table2, 'Date')
class(table2$Date)
table1 = data.frame(Date1='2010-03-05', Date2='2023-09-09')
class(table1$Date1)
table1 = convertDate(table1, list('Date1','Date2'))
class(table1$Date1)
class(table1$Date2)

答案 1 :(得分:1)

lapply会在这里工作

tbl <- data.frame(bar = 1, Date1 = "2010-03-05", Date2 = "2023-09-09", stringsAsFactors = FALSE)
str(tbl)
# 'data.frame': 1 obs. of  3 variables:
#   $ bar  : num 1
# $ Date1: chr "2010-03-05"
# $ Date2: chr "2023-09-09"

tbl[, -1] <- as.data.frame(lapply(tbl[, -1], as.Date))
str(tbl)
# 'data.frame': 1 obs. of  3 variables:
# $ bar  : num 1
# $ Date1: Date, format: "2010-03-05"
# $ Date2: Date, format: "2023-09-09"

作为一项功能:

convertDate <- function(table, columns) {
 table[, columns] <- as.data.frame(lapply(table[, columns, drop = FALSE], as.Date))
 return(table)
}