1

read.cv2()我通过该函数在 R 中导入了一个 .csv 文件(来自 Excel 2010) 。

我得到一个dataframe. 我的专栏名称应该是日期,但我得到类似X08.03.2013.

我有几个问题:

  1. 如何将这些名称设置为日期格式(行名同上)?
  2. 对于列,一旦我得到日期格式,我如何在这些日期上使用条件(如果)?

我希望我已经足够清楚了。感谢您的帮助。

4

2 回答 2

5

这里有一个小例子供你尝试:

编造一些数据并尝试读入

# 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
于 2013-02-28T09:23:22.443 回答
2

回答你的两个问题。

  1. 您使用check.names=FALSE参数加载 csv
  2. 列名不能是dates. 他们需要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
于 2013-02-28T09:21:41.190 回答