R Data Manipulation,将平面表转换为结构表

时间:2016-10-12 06:59:48

标签: r data.table transformation spread

我的目标是转换格式的数据框:

ID 1    ID 2    Value
5        k        7
5        k        2
5        l        4
6        b        2

进入表格表格:

ID 1    k    l    b
5       7    4      
6                 2

然后我想操纵数据并再次返回第一种格式。

我通过在库(tidyr)中使用函数spread()来尝试它,但只获得以下格式(这不是我想要的):

ID 1    k   l   b
5       7       
5       7       
5           4   
6               2

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

目前尚不清楚如何处理重复项,但这是一次尝试,

library(dplyr)
library(tidyr)
df1 <- df[!duplicated(df[c('ID1', 'ID2')]),] %>% 
                                    group_by(ID1) %>% 
                                    spread(ID2, Value, fill = '')

df1
#Source: local data frame [2 x 4]
#Groups: ID1 [2]

#    ID1     b     k     l
#  <int> <chr> <chr> <chr>
#1     5           7     4
#2     6     2     

要回到原来我们需要gather,即

df2 <- df1 %>% 
         gather(ID2, Value, b:l) %>% 
         filter(Value != '') 

df2
#Source: local data frame [3 x 3]
#Groups: ID1 [2]

#    ID1   ID2 Value
#  <int> <chr> <chr>
#1     6     b     2
#2     5     k     7
#3     5     l     4

但是,我们错过了重复项,因此我们rbind将它们转移到gather数据框,即

rbind(as.data.frame(df2), df[duplicated(df[c('ID1', 'ID2')]),])
#    ID1 ID2 Value
#1    6   b     2
#2    5   k     7
#3    5   l     4
#21   5   k     2

在您澄清之后,如果您没有重复,那么

df1 <- df %>% group_by(ID1) %>% spread(ID2, Value, fill = '')

并回到原来的

df2 <- df1 %>% gather(ID2, Value, b:l) %>% filter(Value != '')

答案 1 :(得分:1)

您的问题的一个解决方案是:

x <- data.frame(ID1 = c(5,5,5,6),
                ID2 = c("k","k","l","b"),
                Value = c(7,2,4,2))

x <- dcast(x, ID1 ~ ID2, value.var = "Value", fun.aggregate = max, fill = 0)

> x
  ID1 b k l
1   5 0 7 4
2   6 2 0 0

我已经处理了具有max功能的ID1 / ID2组合的非唯一值。向相反方向移动将使用melt函数...但我们无法恢复聚合中丢失的值:

melt(x, id.vars = "ID1", variable.name = "ID2")