[英]How can I convert from wide to long, using two rows for the key and value in tidyverse gather?
我正在尝试使用 tidyverse 的gather
命令将我的数据从宽转换为长(我宁愿避免熔化/转换。)但是,我的数据有两个我想在转换中使用的匹配行。
`2018 Data` Codes `Code1` `Code2` `Code3`
1 ID Names Code1Name Code2Name Code3Name
2 1110 Crop… 0 0 0
3 1120 Anim… 0 0 0
4 1131 Timb… 0 0 0
您会注意到数据很奇怪,因为有两行带有变量名,但第二行被视为观察的第一行。 代码和代号匹配,但我还没有找到一种方法来执行匹配它们的正确收集命令。 目前,我有类似df_tall<-gather(df_wide, key="Codes", value="CodeValue")
但是,这与名称不正确匹配。
我想得到的理想数据如下:
ID Names Codes CodeValue
1 1110 Crop… Code1Name Code1 0
2 1110 Crop… Code2Name Code2 0
3 1110 Crop… Code3Name Code3 0
关于如何实现这一目标的任何想法?
StackOverflow 上关于从宽转换为长的问题很少,但我没有找到类似问题的运气(如果我忽略了一些问题,请纠正我)。
尝试这个:
DF <- data.frame(`2018 Data` = c("ID","1110","1120","1131"),
Codes = c("Names","Crop..","Anim..","Timb.."),
`Code1` = c("Code1Name","0","0","0"),
`Code2` = c("Code2Name","0","0","0"),
`Code3` = c("Code3Name","0","0","0"))
names(DF) <- unname(unlist(DF[1,]))
DF %>%
filter(ID != "ID") %>%
pivot_longer(starts_with("Code"), names_to = "Codes", values_to = "Value") %>%
mutate(Code = sub("Name","",Codes)) %>%
select(ID, Names, Codes, Code, Value) %>%
as.data.frame()
结果
ID Names Codes Code Value
1 1110 Crop.. Code1Name Code1 0
2 1110 Crop.. Code2Name Code2 0
3 1110 Crop.. Code3Name Code3 0
4 1120 Anim.. Code1Name Code1 0
5 1120 Anim.. Code2Name Code2 0
6 1120 Anim.. Code3Name Code3 0
7 1131 Timb.. Code1Name Code1 0
8 1131 Timb.. Code2Name Code2 0
9 1131 Timb.. Code3Name Code3 0
PS: gather()
函数已pivot_longer()
,请改用pivot_longer()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.