read.cv2()
我通过该函数在 R 中导入了一个 .csv 文件(来自 Excel 2010) 。
我得到一个dataframe
. 我的专栏名称应该是日期,但我得到类似X08.03.2013
.
我有几个问题:
- 如何将这些名称设置为日期格式(行名同上)?
- 对于列,一旦我得到日期格式,我如何在这些日期上使用条件(如果)?
我希望我已经足够清楚了。感谢您的帮助。
这里有一个小例子供你尝试:
# This just creates a CSV in your current working directory to play with
cat("08-03-2013;08-04-2013;08-05-2013\n0,5;0,5;0,5\n0,6;0,6;0,6\n",
file = "FunkyNames.csv")
read.csv2("FunkyNames.csv")
# X08.03.2013 X08.04.2013 X08.05.2013
# 1 0.5 0.5 0.5
# 2 0.6 0.6 0.6
read.csv2("FunkyNames.csv", check.names = FALSE)
# 08-03-2013 08-04-2013 08-05-2013
# 1 0.5 0.5 0.5
# 2 0.6 0.6 0.6
如您所见,使用read.csv2()
withcheck.names = FALSE
可以获取输入文件中的名称。现在,让我们使用它并尝试提取一些数据。
temp <- read.csv2("FunkyNames.csv", check.names = FALSE)
## Our first attempt doesn't work
temp$08-03-2013
# Error: unexpected numeric constant in "temp$08"
## Using quotes works
temp$"08-03-2013"
# [1] 0.5 0.6
## The following would work too
## temp$`08-03-2013`
## temp$'08-03-2013'
提取某些列的更有效方法是创建 的 的单独向量,names
使用data.frame
将它们转换为日期as.Date
,然后使用该向量从原始data.frame
. 一些例子:
tempCols <- as.Date(names(temp), format = "%m-%d-%Y")
tempCols
temp[tempCols > "2013-08-04"]
# 08-05-2013
# 1 0.5
# 2 0.6
temp[tempCols >= "2013-08-04"]
# 08-04-2013 08-05-2013
# 1 0.5 0.5
# 2 0.6 0.6
回答你的两个问题。
check.names=FALSE
参数加载 csvdates
. 他们需要characters
。但是,您可以对列名进行基于字符的搜索,并仅选择满足特定要求的那些列
df <- as.data.frame(cbind(sample(10), sample(10)))
names(df) <- c("08.03.2013", "09.03.2013")
df
## 08.03.2013 09.03.2013
## 1 8 10
## 2 3 8
## 3 4 3
## 4 1 9
## 5 5 5
## 6 6 4
## 7 10 6
## 8 9 7
## 9 2 1
## 10 7 2
# Either do character based search using regex
df[, grep("08.03.2013", names(df)), drop = FALSE]
## 08.03.2013
## 1 8
## 2 3
## 3 4
## 4 1
## 5 5
## 6 6
## 7 10
## 8 9
## 9 2
## 10 7
df[, grep("09.03.2013", names(df)), drop = FALSE]
## 09.03.2013
## 1 10
## 2 8
## 3 3
## 4 9
## 5 5
## 6 4
## 7 6
## 8 7
## 9 1
## 10 2
# Or even convert names to Dates and then compare.
df[, as.Date(names(df), format = "%d.%m.%Y") == as.Date("2013-03-08"), drop = FALSE]
## 08.03.2013
## 1 8
## 2 3
## 3 4
## 4 1
## 5 5
## 6 6
## 7 10
## 8 9
## 9 2
## 10 7
df[, as.Date(names(df), format = "%d.%m.%Y") > as.Date("2013-03-08"), drop = FALSE]
## 09.03.2013
## 1 10
## 2 8
## 3 3
## 4 9
## 5 5
## 6 4
## 7 6
## 8 7
## 9 1
## 10 2