R数据操作,将平面表转换为结构表

R数据操作,将平面表转换为结构表,r,data.table,transformation,spread,R,Data.table,Transformation,Spread,我的目标是转换表单的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 进入以下表格中: ID 1 ID 2 Value 5 k 7 5 k

我的目标是转换表单的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
进入以下表格中:

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()进行了尝试,但只得到以下格式(这不是我想要的):


感谢您的帮助

解决您问题的方法如下:

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

不清楚您希望如何处理重复项,但这里有一个尝试

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     
但是,我们缺少重复项,因此我们将它们绑定到
收集
ed数据帧,即

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 = '')
df1%分组依据(ID1)%>%排列(ID2,值,填充=“”)
回到原来的样子

df2 <- df1 %>% gather(ID2, Value, b:l) %>% filter(Value != '')
df2%聚集(ID2,值,b:l)%>%过滤器(值!='')

数据有一个问题:ID1=5/ID2=k的组合不是唯一的。有两个值与之关联。值“2”到哪里去了?或者你对最大价值感兴趣?此外,在聚合之后,由于在聚合过程中丢失了一些信息,因此无法返回原始格式;dcast(setDT(df)[,Value[1],(ID1,ID2)],ID1~ID2)很抱歉,我提供的数据中确实有错误。请忽略第二行。初始data.frame应为1 ID 2值5 k 7 5 l 4 6 b 2,不知道如何编辑。在第一个数据帧中没有第二行,在初始post中提供的最后一个数据帧中没有第二行@A.Val.我假设您的方法在没有max函数的情况下仍然有效?是的,只有当非唯一ID值发生冲突时才需要聚合函数。@Walde要编辑,请单击
df2 <- df1 %>% gather(ID2, Value, b:l) %>% filter(Value != '')