-1

我的目标是转换表单的data.frame:

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

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

我通过使用 library(tidyr) 中的函数 spread() 进行了尝试,但只得到以下格式(这不是我想要的):

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

感谢您的帮助

4

2 回答 2

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将它们添加到gathered 数据框,即

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 != '')
于 2016-10-12T07:39:44.530 回答
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

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

melt(x, id.vars = "ID1", variable.name = "ID2")
于 2016-10-12T07:26:20.077 回答