r 中的列到行

时间:2021-08-01 15:37:46

标签: r dataframe row multiple-columns

我有一个这样的数据框:

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

我想把它变成这张桌子:

<头>
日期 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)

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

2 个答案:

答案 0 :(得分:2)

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

> 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

答案 1 :(得分: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')