2016-03-06 57 views
0

我有一個因素langalg數據和我喜歡的選擇langalg之間都比較差:結合colums的因素

> perf[perf$lang == "java", c("alg", "cpu")] 
       alg cpu 
173 binarytrees 0.196 
174 chameneosredux 0.404 
175 fannkuchredux 0.648 

> perf[perf$lang == "python3", c("alg", "cpu")] 
       alg cpu 
246 binarytrees 0.972 
248 fannkuchredux 13.752 
249   fasta 1.152 

對於​​我期望得到0.196/0.972,但對於chameneosreduxNA,爲fannkuchredux0.648/13.752,爲fastaNA ...

一種方法是對行進行排序但我不明白如何在缺失因子(unique(perf$alg)中可用的所有因子)上注入行NA

UPDATE儘管原來的問題,我覺得我喜歡兩個數據幀的列組合成上相同的因素單獨的數據幀:

binarytrees 0.196 0.972 
chameneosredux 0.404  NA 
     fasta NA 1.152 
fannkuchredux 0.648 13.752 
+1

也許是一個答案,你原來的Q ...'aggregate(cpu_alg,data = perf [perf $ lang%in%c(「java」,「python3」),],function(x)x [1]/x [2])' – user20650

+0

否則,重新編輯..你可以重新設計你的數據..'reshape2 :: dcast(alg〜lang,data = perf,value.var =「cpu」)' – user20650

+0

@ user20650獲取** errror **:* variable長度在實際數據上有所不同(針對'alg')*。 java/python3 slice中的行數存在差異(對於第一個建議)。 – gavenkoa

回答

1

你要找的本質是在SQL中,FULL OUTER JOIN這可以使用all = TRUEbase::merge完成。

這裏是一個可比的數據集與證明:

Df <- data.frame(
    Lang = rep(LETTERS[1:5], rep(3, 5)), 
    Alg = c(replicate(5, sample(letters[1:4], 3))), 
    Cpu = rnorm(15), 
    stringsAsFactors = FALSE 
) 

請注意,我使用stringsAsFactors = FALSE。我建議你將你的列轉換爲character向量;我看不出有什麼需要在這裏使用factor


這是一個輕包裝功能merge操作,只是爲了演示乾淨了一點:

compare <- function(x, y, data) { 
    merge(x = data[data$Lang == x[1], 2:3], 
      y = data[data$Lang == y[1], 2:3], 
      by = "Alg", all = TRUE, 
      suffixes = c(paste0(".", x[1]), 
         paste0(".", y[1])) 
    ) 
} 

這裏,它是在使用中:

compare("A", "D", Df) 
# Alg  Cpu.A  Cpu.D 
#1 a   NA -0.06520117 
#2 b 1.0587151 0.08379303 
#3 c -2.0390119   NA 
#4 d -0.8574474 1.27865596 

compare("A", "C", Df) 
# Alg  Cpu.A  Cpu.C 
#1 b 1.0587151 -1.0230431 
#2 c -2.0390119 -0.7691048 
#3 d -0.8574474 -1.2421078 

關於我的commen噸,這也可以使用sqldf來實現。 SQLite不支持FULL OUTER JOIN,但是這不應該是太大的問題,如果你是舒服SQL,因爲有可能是十幾個方法可以解決的是:

library(sqldf) 

sqldf(
    "select x.Alg 
     ,lhs.Cpu as 'Cpu.A' 
     ,rhs.Cpu as 'Cpu.D' 
    from (
     select distinct d.Alg 
     from Df d 
    ) x 
    left join Df lhs on lhs.Alg = x.Alg and lhs.Lang = 'A' 
    left join Df rhs on rhs.Alg = x.Alg and rhs.Lang = 'D' 
    order by x.Alg" 
) 

# Alg  Cpu.A  Cpu.D 
#1 a   NA -0.06520117 
#2 b 1.0587151 0.08379303 
#3 c -2.0390119   NA 
#4 d -0.8574474 1.27865596 
+1

感謝您的幫助。我已經有了另一個我用SQL語言編寫的問題!可悲的是我還沒有找到'SQL <=> R'作弊碼。經過很多SQL查詢,我認爲在SQL範例中(( – gavenkoa

+1

)'data.table'和'dplyr'包對於R中的數據類似SQL操作是非常有用的,特別是聚集,如果其他所有的失敗, sqldf'允許你在數據上執行SQL語句。就好像它們是數據庫表一樣。不幸的是,它不支持TSQL/MSSQL後端,但根據你的配置('SQLite,MySQL'等),支持許多ANSI SQL操作。 – nrussell