R -将表转换为 Dataframe ,同时保留第一列

sulc1iza  于 2023-02-26  发布在  其他
关注(0)|答案(3)|浏览(135)

给定格式的原始 Dataframe df

Date        Cat
   <POSIXct>   <chr>
1  2019-10-3   A
2  2019-10-3   A
3  2019-10-3   B
4  2019-10-4   A
5  2019-10-4   C
6  2019-10-4   C
7  2019-10-4   C
8  2019-10-5   B
9  2019-10-5   C

我执行df_table <- table(df)运算得到df_table的形式

Cat
Date        A   B   C
2019-10-3   2   1   0
2019-10-4   1   0   3
2019-10-5   0   1   1

因为我需要按Date分组的每个Cat的计数。
我需要将表转换为 Dataframe ,并使用值进行绘图。但是当尝试as.data.frame.matrix(df_table)时,它给出了输出

A      B      C
            <int>  <int>  <int>
2019-10-3   2      1      0
2019-10-4   1      0      3
2019-10-5   0      1      1

而我想要的是

Date        A      B      C
<POSIXct>   <int>  <int>  <int>
2019-10-3   2      1      0
2019-10-4   1      0      3
2019-10-5   0      1      1

我想保留表中的第一列作为转换后的 Dataframe 中的一列。我还想保留数据类型。在应用table时,日期似乎会变成一个chr对象,而不是原来的POSIX对象。

jxct1oxe

jxct1oxe1#

基于您的方法,可以进一步使用tibble::rownames_to_column()

library(dplyr)

table(df) %>%
  as.data.frame.matrix() %>%
  tibble::rownames_to_column("Date") %>%
  mutate(Date = as.POSIXct(Date))

或者以另一种方式使用tidyr::pivot_wider()values_fn = length进行计数:

library(tidyr)

df %>% 
  pivot_wider(names_from = Cat, 
              values_from = Cat, 
              values_fn = length,
              values_fill = 0)

# # A tibble: 3 × 4
#   Date                    A     B     C
#   <dttm>              <int> <int> <int>
# 1 2019-10-03 00:00:00     2     1     0
# 2 2019-10-04 00:00:00     1     0     3
# 3 2019-10-05 00:00:00     0     1     1
tcomlyy6

tcomlyy62#

如果要绘制. https://www.statology.org/long-vs-wide-data/,可能需要将其保留为长格式

library(tidyverse)

df %>% 
  count(Date, Cat) %>%  
  ggplot(aes(x = Date, y = n, fill = Cat)) + 
  geom_col(position = "dodge2") + 
  theme_light()

zmeyuzjn

zmeyuzjn3#

table()结果中的这些日期是行名称,因此它们不构成列,尽管您可以将该向量cbind()到结果data.frame并将其转换回POSIXct

df_table <- table(df)
str(df_table)
#>  'table' int [1:3, 1:3] 2 1 0 1 0 1 0 3 1
#>  - attr(*, "dimnames")=List of 2
#>   ..$ Date: chr [1:3] "2019-10-03" "2019-10-04" "2019-10-05"
#>   ..$ Cat : chr [1:3] "A" "B" "C"

df_mt <- cbind(
  dimnames(df_table)[1], 
  as.data.frame.matrix(df_table))

df_mt$Date <- as.POSIXct(df_mt$Date)
df_mt
#>                  Date A B C
#> 2019-10-03 2019-10-03 2 1 0
#> 2019-10-04 2019-10-04 1 0 3
#> 2019-10-05 2019-10-05 0 1 1

str(df_mt)
#> 'data.frame':    3 obs. of  4 variables:
#>  $ Date: POSIXct, format: "2019-10-03" "2019-10-04" ...
#>  $ A   : int  2 1 0
#>  $ B   : int  1 0 1
#>  $ C   : int  0 3 1

还有as.data.frame.table(),日期仍然是字符串,因为它们来自行名称:

as.data.frame.table(df_table, stringsAsFactors = F)
#>         Date Cat Freq
#> 1 2019-10-03   A    2
#> 2 2019-10-04   A    1
#> 3 2019-10-05   A    0
#> 4 2019-10-03   B    1
#> 5 2019-10-04   B    0
#> 6 2019-10-05   B    1
#> 7 2019-10-03   C    0
#> 8 2019-10-04   C    3
#> 9 2019-10-05   C    1

但你可能会发现,计算和调整自己更容易:

library(dplyr)
library(tidyr)

df %>% 
  count(Date, Cat) %>% 
  pivot_wider(names_from = Cat, 
              values_from = n, 
              values_fill = 0)
#> # A tibble: 3 × 4
#>   Date                    A     B     C
#>   <dttm>              <int> <int> <int>
#> 1 2019-10-03 00:00:00     2     1     0
#> 2 2019-10-04 00:00:00     1     0     3
#> 3 2019-10-05 00:00:00     0     1     1

示例数据:

df_str <- "Date        Cat
1  2019-10-3   A
2  2019-10-3   A
3  2019-10-3   B
4  2019-10-4   A
5  2019-10-4   C
6  2019-10-4   C
7  2019-10-4   C
8  2019-10-5   B
9  2019-10-5   C"

df <- read.table(text = df_str, header = T)
df$Date <- as.POSIXct(df$Date)

创建于2023年2月25日,使用reprex v2.0.2

相关问题