重构R中的数据帧

时间:2016-05-23 20:56:15

标签: r dplyr data-manipulation

我的数据框如下所示:

COL1    COL2    Value
 A       A1      0.9
 A       A2      1.8
 A       A3      0.2
 B       B1      4.6
 B       B2      0.9
 B       A1      8.4

我想重新格式化上面的数据框,使其看起来如下所示,以便我根据COL1的所有可能组合及其相应的值:

COL1    COL2    COL3    VALUE_1    VALUE_2
 A       A1      A2       0.9        1.8
 A       A1      A3       0.9        0.2
 A       A2      A3       1.8        0.2
 B       B1      B2       4.6        0.9
 B       B1      A1       4.6        8.4
 B       B2      A1       0.9        8.4

有人知道一个简单的方法吗?谢谢!

2 个答案:

答案 0 :(得分:2)

使用此数据:

df = structure(list(COL1 = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A", 
"B"), class = "factor"), COL2 = structure(c(1L, 2L, 3L, 4L, 5L, 
1L), .Label = c("A1", "A2", "A3", "B1", "B2"), class = "factor"), 
    Value = c(0.9, 1.8, 0.2, 4.6, 0.9, 8.4)), .Names = c("COL1", 
"COL2", "Value"), class = "data.frame", row.names = c(NA, -6L
))

我们可以利用因子排序进行重复数据删除并使用dplyr

# create second dataframe with new names
df2 = df
names(df2) = c("COL1", "COL3", "VALUE2")

df %>% left_join(df2) %>%
    filter(as.numeric(COL2) < as.numeric(COL3))

  COL1 COL2 Value COL3 VALUE2
1    A   A1   0.9   A2    1.8
2    A   A1   0.9   A3    0.2
3    A   A2   1.8   A3    0.2
4    B   B1   4.6   B2    0.9
5    B   A1   8.4   B1    4.6
6    B   A1   8.4   B2    0.9

您可以根据需要使用select重新排列和重命名列。

答案 1 :(得分:1)

使用base R,我们可以进行自我合并和子集

subset(merge(df, df, by.x= "COL1", by.y = "COL1"), as.numeric(COL2.x) < as.numeric(COL2.y))
#   COL1 COL2.x Value.x COL2.y Value.y
#2     A     A1     0.9     A2     1.8
#3     A     A1     0.9     A3     0.2
#6     A     A2     1.8     A3     0.2
#11    B     B1     4.6     B2     0.9
#16    B     A1     8.4     B1     4.6
#17    B     A1     8.4     B2     0.9

我们可以使用colnames

更改列名称