我尝试了两种方法来按列值对数据框进行排序:
dateCol = "DATE"
df <- data.frame( DATE = c("01-10-2020","01-04-2020","01-06-2020","01-02-2020"),
VAL = c(3,7,4,5))
# Method 1
df <- df[order(df[dateCol]),]
# Method 2
df <- df[order(df[which(colnames(df)==dateCol)]),]
它们都会触发相同的警告消息:
Warning messages:
1: In xtfrm.data.frame(x) : cannot xtfrm data frames
2: In xtfrm.data.frame(x) : cannot xtfrm data frames
如何避免这种情况?
这里有一些替代方案。全部使用 (1) 中定义的
fmt
。
1) Base R 日期格式不明确,但请选择下面的
fmt
值之一。然后选择所需的列,将其转换为 Date 类,找到对其进行排序的索引,然后应用它们。
# choose one of the following
fmt <- "%d-%m-%Y"
fmt <- "%m-%d-%Y"
df2 <- df # in case we need to preserve input
df2[[dateCol]] <- as.Date(df2[[dateCol]], fmt)
o <- order(df2[[dateCol]])
df2[o, ]
## DATE VAL
## 4 2020-01-02 5
## 2 2020-01-04 7
## 3 2020-01-06 4
## 1 2020-01-10 3
2)zoo 另一种可能性是将其转换为zoo对象,然后可能再转换回来。转换会自动对其进行排序并将其转换为 Date 类。如果结果是动物园对象没问题,则省略最后一行。
library(zoo)
VAL <- read.zoo(df, index = dateCol, format = fmt)
fortify.zoo(VAL, name = dateCol)
## DATE VAL
## 1 2020-01-02 5
## 2 2020-01-04 7
## 3 2020-01-06 4
## 4 2020-01-10 3
3) dplyr 我们可以转换日期然后使用arrange来排序。
library(dplyr)
df %>%
mutate(!!dateCol:=as.Date(.[[dateCol]], fmt)) %>%
arrange(.[[dateCol]])
## DATE VAL
## 1 2020-01-02 5
## 2 2020-01-04 7
## 3 2020-01-06 4
## 4 2020-01-10 3
而不是编写
[dateCol]
,您需要编写 [,dateCol]
来指定 dateCol
是列的名称。
这些代码对我有用:
df <- df[order(df[,dateCol]),]
df <- df[order(df[,which(colnames(df)==dateCol)]),]
希望这个回答可以帮助到你。