2016-08-16 81 views
-1

我想讓col1,col2,col3和col4中的所有字符串都是唯一的,然後將它們的res值放在它前面。所以輸出是這個樣子我該如何操縱基於多個列字符串的數據幀

我想有這樣的

output <- structure(list(col1 = structure(c(13L, 14L, 16L, 17L, 27L, 18L, 
26L, 25L, 24L, 4L, 7L, 9L, 11L, 21L, 22L, 23L, 5L, 8L, 10L, 12L, 
15L, 1L, 2L, 3L, 6L, 19L, 20L), .Label = c("A8WFJ8", "A8WFK2", 
"A8WHR6", "A8WHS3", "A8WIT0", "A8XQE0", "A9D0C6", "A9D4S6", "A9D649", 
"A9D8E6", "A9UJN4", "A9Z1L6", "ADliba1", "ADNIL2", "B0M0N9", 
"DFGH2", "GDH76", "ML2IS5", "Q9XXL6", "Q9XXN0", "Q9XXN2", "Q9XXQ4", 
"Q9XXQ6", "QSEA12", "RR2JDG", "T2HDY3", "TR5421"), class = "factor"), 
    res1 = c(3.59e-08, 2.15e-08, 1.52e-07, 1.24e-07, 4.53e-08, 
    3.11e-08, 7.08e-08, 1.98e-08, 1.46e-08, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), res2 = c(8.11e-07, 7.21e-08, 
    0, 4.02e-08, 0, 0, 2.32e-08, 0, 1.46e-08, 3.86e-08, 2.68e-08, 
    2.7e-08, 7.76e-08, 7.76e-08, 7.76e-08, 7.76e-08, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0), res3 = c(8.76e-08, 1.4e-07, 0, 2.8e-08, 
    0, 0, 0, 0, 0, 0, 7.85e-08, 0, 0, 0, 0, 0, 2.13e-08, 3.57e-08, 
    1.46e-07, 5.23e-08, 6.44e-08, 0, 0, 0, 0, 0, 0), res4 = c(1.42e-07, 
    8.66e-08, 0, 7.64e-08, 0, 0, 6.28e-07, 0, 0, 0, 7.25e-07, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.26e-05, 8.58e-08, 2.83e-08, 
    3.7e-08, 1.26e-05, 8.58e-08)), .Names = c("col1", "res1", 
"res2", "res3", "res4"), class = "data.frame", row.names = c(NA, 
-27L)) 
+0

你最初是以「df」結尾的?我認爲,如果可能的話,你應該回頭一步,儘量避免首先做出這些不尋常的數據。 – thelatemail

+0

你確定原來的'df'是正確的嗎?列的名字是'V1','V2','V3',...,第一行是'col1','res1','col2',... 46行中只有13行其中的任何數據。 – Barker

+0

@巴克爾我糾正它,抱歉的錯誤。請看上面的 –

回答

3

輸出通過清理數據

# organizes your "col" and "res" values into different lists 
splitDF <- lapply(seq(1, ncol(df), by = 2), 
        function(x) df[x:(x+1)]) 
# renames first column to make it easier for the merge 
splitDF <- lapply(splitDF, function(x) names(x)[1] <- "col1") 
# removes blank lines 
splitDF <- lapply(splitDF, function(x) x[complete.cases(x), ]) 

然後你可以用偉大的合併方案開始發現here收集整合到一個數據框中。

output <- Reduce(function(...) merge(..., all=T), splitDF) 

最後,您可以將所有NA值設置爲零並對行重新排序。

output[is.na(output)] <- 0 
varOrder <- c("ADliba1", "ADNIL2", "DFGH2", "GDH76", "TR5421", "ML2IS5", 
       "T2HDY3", "RR2JDG", "QSEA12", "A8WHS3", "A9D0C6", "A9D649", 
       "A9UJN4", "Q9XXN2", "Q9XXQ4", "Q9XXQ6", "A8WIT0", "A9D4S6", 
       "A9D8E6", "A9Z1L6", "B0M0N9", "A8WFJ8", "A8WFK2", "A8WHR6", 
       "A8XQE0", "Q9XXL6", "Q9XXN0") 
output <- output[match(varOrder, output[["col1"]]), ] 
+0

我已經喜歡你的解決方案,但是,在我接受之前,我想知道你是否可以按照列的順序不變的方式來完成。看看'output'的頂部,你看到它和df1不一樣,可能嗎?如果沒有,我會接受你的答案無論如何 –

+0

我不確定你的意思是「列的順序沒有改變」。由於您的四個「col」列中有不同但重疊的值,因此我並不清楚訂單的明確定義。如果你可以定義「訂單」,我會看看我是否能找出解決方案。 – Barker

+0

感謝您的關注。我的意思是看第一欄,它可以保持原樣而不是安排不同嗎?你明白我的意思嗎?如果不是,請讓我知道我會在上面展示它。也請不要投我的問題,你已經回答了,所以我會喜歡並接受你的回答 –