【问题标题】:R manipulating data by a rowR按行操作数据
【发布时间】:2023-03-07 04:26:02
【问题描述】:

考虑以下数据框:

R
df1<-
data.frame(
ostan=rep( paste("ostan",1:3),each=12),
year=rep(c(2020,2021),each=6,len=36),
month=rep(c(1:3),each=2,len=36),
ENF=rep(letters[1:2],len=36),
Fo=1:36,
JA=36:1
,KH=c(1:12,12:1,21:32)
)

变量“Fo”、“JA”和“KH”是某些事件的频率。我想为变量“ENF”的每个值计算这些频率,如下所示:

认为这是一个测试数据! “ENF”列中的真实数据标签过多。输出应该是一个数据框。

【问题讨论】:

  • 另外,查看arules 包和apriori 函数。它可以帮助您找出所有可能的变量组合。

标签: r reshape tidyr dcast


【解决方案1】:

您可以使用以下解决方案。此输出与您要查找的内容接近,因为 R 的数据帧不能有多个标题,但是,我们当然可以使用包 kableExtra 来生成具有多个标题的表:

library(tidyr)

df1 %>%
  pivot_wider(names_from = ENF, 
              values_from = c(Fo, JA, KH), 
              names_glue = "{ENF}_{.value}")

# A tibble: 18 x 9
   ostan    year month  a_Fo  b_Fo  a_JA  b_JA  a_KH  b_KH
   <chr>   <dbl> <int> <int> <int> <int> <int> <int> <int>
 1 ostan 1  2020     1     1     2    36    35     1     2
 2 ostan 1  2020     2     3     4    34    33     3     4
 3 ostan 1  2020     3     5     6    32    31     5     6
 4 ostan 1  2021     1     7     8    30    29     7     8
 5 ostan 1  2021     2     9    10    28    27     9    10
 6 ostan 1  2021     3    11    12    26    25    11    12
 7 ostan 2  2020     1    13    14    24    23    12    11
 8 ostan 2  2020     2    15    16    22    21    10     9
 9 ostan 2  2020     3    17    18    20    19     8     7
10 ostan 2  2021     1    19    20    18    17     6     5
11 ostan 2  2021     2    21    22    16    15     4     3
12 ostan 2  2021     3    23    24    14    13     2     1
13 ostan 3  2020     1    25    26    12    11    21    22
14 ostan 3  2020     2    27    28    10     9    23    24
15 ostan 3  2020     3    29    30     8     7    25    26
16 ostan 3  2021     1    31    32     6     5    27    28
17 ostan 3  2021     2    33    34     4     3    29    30
18 ostan 3  2021     3    35    36     2     1    31    32

或者在 base R 中我们可以这样做:

reshape(df1, direction = "wide", 
        idvar = c("ostan", "year", "month"),
        timevar = "ENF")

【讨论】:

    【解决方案2】:

    您可以从tidyr 使用pivot_wider -

    tidyr::pivot_wider(df1, names_from = ENF, values_from = Fo:KH)
    
    #   ostan    year month  Fo_a  Fo_b  JA_a  JA_b  KH_a  KH_b
    #   <chr>   <dbl> <int> <int> <int> <int> <int> <int> <int>
    # 1 ostan 1  2020     1     1     2    36    35     1     2
    # 2 ostan 1  2020     2     3     4    34    33     3     4
    # 3 ostan 1  2020     3     5     6    32    31     5     6
    # 4 ostan 1  2021     1     7     8    30    29     7     8
    # 5 ostan 1  2021     2     9    10    28    27     9    10
    # 6 ostan 1  2021     3    11    12    26    25    11    12
    # 7 ostan 2  2020     1    13    14    24    23    12    11
    # 8 ostan 2  2020     2    15    16    22    21    10     9
    # 9 ostan 2  2020     3    17    18    20    19     8     7
    #10 ostan 2  2021     1    19    20    18    17     6     5
    #11 ostan 2  2021     2    21    22    16    15     4     3
    #12 ostan 2  2021     3    23    24    14    13     2     1
    #13 ostan 3  2020     1    25    26    12    11    21    22
    #14 ostan 3  2020     2    27    28    10     9    23    24
    #15 ostan 3  2020     3    29    30     8     7    25    26
    #16 ostan 3  2021     1    31    32     6     5    27    28
    #17 ostan 3  2021     2    33    34     4     3    29    30
    #18 ostan 3  2021     3    35    36     2     1    31    32
    

    data.table 你可以使用dcast -

    library(data.table)
    
    dcast(setDT(df1), ostan + year + month ~ ENF, value.var = c('Fo', 'JA', 'KH'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 2019-12-04
      • 1970-01-01
      • 2021-06-28
      • 2021-06-28
      • 2015-09-19
      相关资源
      最近更新 更多