微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以宽格式转换数据,同时保留变量的对齐方式

如何解决以宽格式转换数据,同时保留变量的对齐方式

我在 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 举报,一经查实,本站将立刻删除。