【问题标题】:Calculate differences between unique pairings of data.frame variables计算 data.frame 变量的唯一配对之间的差异
【发布时间】:2014-04-14 02:57:05
【问题描述】:

我有一个data.frame data:

Sector Var1 Var2 Var3
Abcd    1    1    1
Efgh    4    5    6
Ijkl    7    8    9

我想创建一个新的 data.frame,其中包含每个变量的 Sector 的每个唯一配对之间的差异。期望结果的示例如下:

# result
Sector1 Sector2 Dif_Var1 Dif_Var2 Dif_Var3
Abcd    Efgh        3        4        5
Abcd    Ijkl        6        7        8
Efgh    Ijkl        3        3        3

我可以找到Sector 的每个唯一对(下面的代码),但我不确定这是否是继续的方法。下面这个最小的伪代码似乎是一条合适且可能成功的路线吗?

# pseudo code
result <- which(Sector1 == Sector) get Var1,2,3 values - which(Sector2 == Sector) get Var1,2,3 values

是否有 r 函数或包可以帮助达到预期的结果?

# unique pairings
# http://stackoverflow.com/q/23024059/1670053
df <- structure(list(Sector = structure(1:3, .Label = c("Abcd", "Efgh", 
"Ijkl"), class = "factor"), Var1 = c(1L, 4L, 7L), Var2 = c(1L, 
5L, 8L), Var3 = c(1L, 6L, 9L)), .Names = c("Sector", "Var1", 
"Var2", "Var3"), class = "data.frame", row.names = c(NA, -3L))
df.u <- expand.grid(df$Sector,df$Sector)
df.u2 <- as.data.frame(unique(t(apply(df.u, 1, function(x) sort(x)))))
data <- subset(df.u2, ! df.u2$V1 == df.u2$V2)

【问题讨论】:

    标签: r dataframe plyr apply difference


    【解决方案1】:

    使用 sqldf 包:

    library(sqldf)
    sqldf("select A.Sector Sector1,
                  B.Sector Sector2,
                  B.Var1 - A.Var1 Var1, 
                  B.Var2 - A.Var2 Var2, 
                  B.Var3 - A.Var3 Var3
                  from df A join df B
                  on A.Sector < B.Sector")
    

    给予:

      Sector1 Sector2 Var1 Var2 Var3
    1    Abcd    Efgh    3    4    5
    2    Abcd    Ijkl    6    7    8
    3    Efgh    Ijkl    3    3    3
    

    也可以这样写:

     nms <- names(df)[-1]
     sel <- toString( sprintf('B.%s - A.%s %s', nms, nms, nms) )
     fn$sqldf("select A.Sector Sector1, B.Sector Sector2, $sel 
               from df A join df B 
               on A.Sector < B.Sector")
    

    修订修正并增加了变化。

    【讨论】:

      【解决方案2】:

      您可以只使用您创建的V1V2 向量来索引df

      df[data$V2, -1] - df[data$V1, -1]
      #    Var1 Var2 Var3
      #2      3    4    5
      #3      6    7    8
      #3.1    3    3    3
      

      保留名字

      cbind(data$V1, data$V2, df[data$V2, -1] - df[data$V1, -1])
      #    data$V1 data$V2 Var1 Var2 Var3
      #2      Abcd    Efgh    3    4    5
      #3      Abcd    Ijkl    6    7    8
      #3.1    Efgh    Ijkl    3    3    3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        相关资源
        最近更新 更多