我的目标是转换格式的数据框:
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
感谢您的帮助
答案 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")