r中的列到行

columns to rows in r

我有一个这样的数据框:

日期 捷克克朗 欧元 美元
2021-07-25 25 15,5555684 4

我想把它变成这个 table:

日期 CP mnozstvi
2021-07-25 捷克克朗 25
2021-07-25 欧元 15,5555684
2021-07-25 DOL 4

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

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

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

您可以在 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

一个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)

如果您的数据包含以逗号,作为分隔符的字符,像这样,

data2

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')