r - 如何拆分数据框的列并重塑它?
问题描述
我正在尝试重构数据,以便将包含多个值的列展开以匹配我在下面列出的所需输出?我做了几次尝试,tidyr::spread()
但tidyr::gather()
都无济于事。有任何想法吗?
dat <- data.frame("name" = c("a", "b", "c"),
"count" = c("2003=22; 2004=32",
"2003=34; 2005=45",
"2005=32; 2006=67"))
name count
a 2003=22; 2004=32
b 2003=34; 2005=45
c 2005=32; 2006=67
期望的输出:
name 2003 2004 2005 2006
a 22 32 NA NA
b 34 NA 45 NA
c NA NA 32 67
解决方案
可能有一种更聪明、更简洁的方法,但这很有效:
library(tidyr)
dat %>%
separate(count, sep = "; ", into = c("c1", "c2")) %>%
gather(Var, Val, -name) %>%
separate(Val, sep = "=", into = c("year", "value")) %>%
select(-Var) %>%
spread(year, value)
name 2003 2004 2005 2006
1 a 22 32 <NA> <NA>
2 b 34 <NA> 45 <NA>
3 c <NA> <NA> 32 67
请注意,这会导致“宽”数据;传播之前的“长”数据可能更容易处理。
推荐阅读
- git - 合并两个分支后,一些文件更改为旧版本,一些文件被删除
- mysql - 在 Docker 中配置 mysql
- java - 我想使用 eclipse gui,但我得到了错误的 java 版本
- c# - 带返回的空合并运算符 (??)
- http - 如何将 net/http.ResponseWriter 转换为 net/http.Response
- javascript - 纱线安装:获取软件包时出现“不是 git 存储库”错误
- java - 如何让其他线程继续锁定for循环java中的元素
- javascript - 在谷歌表格中转置数据时是否可以限制范围
- create-react-app - react-script-ts 是否支持 create-react-app 和 CSS/SCSS 模块?
- c# - 无法从 RTP 数据包中提取 RTP 有效负载