dataframe名称R
我通过read.cv2()
函数在R中导入一个.csv文件(来自Excel 2010)。
我得到一个dataframe
。 我的专栏名称应该是date,但我得到像X08.03.2013
。
我有几个问题:
- 如何将这些名称设置为date格式(同名行)?
- 对于列,一旦我获得了date格式,如何在这些date使用条件(if)?
我希望我已经清楚了。 感谢您的帮助。
这里有一个小例子供你尝试:
编写一些数据并尝试读入
# 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()
和check.names = FALSE
来获取input文件中的名字。 现在,让我们使用它并尝试提取一些数据。
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'
提取某些列的更有效的方法
提取某些列的更有效的方法是创builddata.frame
的names
的单独向量,使用as.Date
将其转换为date,然后使用该向量从原始data.frame
进行子集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
参数加载您的csv - 列名不能是
dates
。 他们需要成为characters
。
但是,您可以对列名进行基于字符的search,并只select那些满足特定要求的列
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