【问题标题】:columns to rows in r [duplicate]r中的列到行[重复]
【发布时间】:2021-08-01 15:37:46
【问题描述】:

我有一个这样的数据框:

DATE CZK EUR USD
2021-07-25 25 15,5555684 4

我想把它变成这张桌子:

DATE CP mnozstvi
2021-07-25 CZK 25
2021-07-25 EUR 15,5555684
2021-07-25 DOL 4

我的 data.frame 要大得多,这只是最小的示例。我寻求一些通用的解决方案。我设法通过这样的函数 gather() 做到了这一点:

data.frame %>% gather(CP,,CZK,EUR,USD) %>% rename(mnozstvi = value)

但它改变了数字,因为其中一些是十进制的,我不知道为什么。知道如何轻松做到这一点吗?谢谢。

【问题讨论】:

  • 数字可能已更改,因为我怀疑您使用 , 而不是 . 作为小数分隔符

标签: r dataframe row multiple-columns


【解决方案1】:

您可以在data.table 包中尝试melt

> melt(setDT(df), id.vars = "DATE",variable.name = "CP",value.name = "mnozstvi")
         DATE  CP mnozstvi
1: 2021-07-25 CZK 25.00000
2: 2021-07-25 EUR 15.55557
3: 2021-07-25 USD  4.00000

或使用stack

> setDT(df)[,setNames(rev(stack(.SD)),c("CP","mnozstvi")),DATE]
         DATE  CP mnozstvi
1: 2021-07-25 CZK 25.00000
2: 2021-07-25 EUR 15.55557
3: 2021-07-25 USD  4.00000

【讨论】:

    【解决方案2】:

    dplyr 解决方案
    这个问题最适合用pivot_longer() 回答,这几乎是gather 的现代版本。

    library(dplyr)
    
    df%>%pivot_longer(cols=c(CZK, EUR, USD), names_to="CP", values_to = 'mnozstvi')
    
    # A tibble: 3 x 3
      DATE       CP    mnozstvi
      <chr>      <chr>    <dbl>
    1 2021-07-25 CZK       25  
    2 2021-07-25 EUR       15.6
    3 2021-07-25 USD        4 
    
    

    数据

    df<-data.frame(DATE=c('2021-07-25'), CZK=25, EUR=15.5555684, USD=4)
    

    如果你的数据有逗号,作为分隔符的字符,像这样,

    数据2

    df<-data.frame(DATE=c('2021-07-25'), CZK=25, EUR='15,5555684', USD=4)
    

    您可能需要在 pivot_longer 操作之前进行一些转换:

    df%>%mutate(across(CZK:USD, ~as.numeric(str_replace_all(.x, ',', '.'))))%>%
            pivot_longer(cols=c(CZK, EUR, USD), names_to="CP", values_to = 'mnozstvi')
    

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2015-09-26
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      相关资源
      最近更新 更多