我有一个这样的数据框:
日期 | 捷克克朗 | 欧元 | 美元 |
---|---|---|---|
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)
但它改变了数字,因为其中一些是十进制的,我不知道为什么。任何想法如何轻松做到这一点?谢谢。
答案 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')