r 中的列到行

我有一个这样的数据框:

日期 捷克克朗 欧元 美元
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)

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

hxcn2004 回答:r 中的列到行

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

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'),EUR='15,5555684',USD=4)

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

df%>%mutate(across(CZK:USD,~as.numeric(str_replace_all(.x,','.'))))%>%
        pivot_longer(cols=c(CZK,values_to = 'mnozstvi')
本文链接:https://www.f2er.com/1494.html

大家都在问