在 xtfrm.data.frame(x) 中:对数据框排序时无法 xtfrm 数据框警告

问题描述 投票:0回答:2

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

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

如何避免这种情况?

r dataframe sorting
2个回答
1
投票

这里有一些替代方案。全部使用 (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

0
投票

而不是编写

[dateCol]
,您需要编写
[,dateCol]
来指定
dateCol
是列的名称。 这些代码对我有用:

df <- df[order(df[,dateCol]),]

df <- df[order(df[,which(colnames(df)==dateCol)]),]

希望这个回答可以帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.