【问题标题】:Reconstructing Data Frame in R在 R 中重建数据框
【发布时间】:2016-05-23 20:56:14
【问题描述】:

我有一个如下所示的数据框:

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

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

【问题讨论】:

    标签: r dplyr data-manipulation


    【解决方案1】:

    使用这些数据:

    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 重新排列和重命名列。

    【讨论】:

      【解决方案2】:

      使用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改变列名

      【讨论】:

        猜你喜欢
        • 2021-12-24
        • 2017-02-11
        • 2021-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多