如何解决以宽格式转换数据,同时保留变量的对齐方式
我在 R 中创建了以下数据框
df<-data.frame("ID"= c("A","A","B","B"))
df$X_F= c(1,5,6,7,1,8)
df$X_A= c(1,8)
以上数据帧为长格式
ID X_F X_A
1 A 1 1
2 A 5 5
3 A 6 6
4 A 7 7
5 B 1 1
6 B 7 7
7 B 8 8
我想将数据帧转换为宽格式。我已经导入了相同的重塑库和数据表库
library(DT)
library(reshape2)
library(data.table)
现在我已经运行了以下代码
df2<-dcast(melt(setDT(df),id.var = "ID"),rowid(ID,variable) ~
paste(ID,variable,sep="__"))[,ID := NULL][]
这产生以下数据帧
A__X_A A__X_F B__X_A B__X_F
1 1 1 1
5 5 7 7
6 6 8 8
7 7 NA NA
如何获取以下数据框
A__X_A A__X_F B__X_A B__X_F
1 1 1 1
5 5 NA NA
6 6 NA NA
7 7 7 7
NA NA 8 8
我如何获得这个结果。我请人看一下
解决方法
试试下面的 data.table
代码
dcast(
melt(setDT(df),id.var = "ID")[,q := match(value,sort(unique(unlist(df[,.(X_F,X_A)])))),ID
],q ~ ID + variable
)
给出
q A_X_F A_X_A B_X_F B_X_A
1: 1 1 1 1 1
2: 2 5 5 NA NA
3: 3 6 6 NA NA
4: 4 7 7 7 7
5: 5 NA NA 8 8
,
替代 dplyr/tidyr 解决方案:
df<-data.frame("ID"= c("A","A","B","B"))
df$X_F= c(1,5,6,7,1,8)
df$X_A= c(1,8)
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = -ID) %>%
mutate(newID = value) %>%
pivot_wider(id_cols = newID,names_from = c(ID,name),values_from = value,values_fn = {first}) %>%
select(-newID)
返回:
A_X_F A_X_A B_X_F B_X_A
<dbl> <dbl> <dbl> <dbl>
1 1 1 1 1
2 5 5 NA NA
3 6 6 NA NA
4 7 7 7 7
5 NA NA 8 8
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。