在xtfrm. Dataframe (x)中:无法xtfrm Dataframe 排序 Dataframe 时出现警告

x6yk4ghg  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(265)

我尝试了两种方法来按列值对数据框进行排序:

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

如何避免这种情况?

omhiaaxx

omhiaaxx1#

这里有一些替代方案.都使用在(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类。如果zoo对象作为结果是正确的,则忽略最后一行。

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

相关问题