2016-09-21 39 views
0

我是新來的,但我敢肯定,這個問題沒有得到回答,或者我只是不擅長搜索....數學函數使用多個匹配標準

我想根據匹配的列和值從特定行中減去多行中的值。我的實際數據將是一個大於5000列的矩陣,每個數據都需要減去一個與因子列中的值相匹配的空白值。

下面是一個例子的數據表:

 c1 c2 c3 c4 c5 
    r1 A 1 2 3 aa 
    r2 B 2 3 4 bb 
    r3 C 3 4 5 aa 
    r4 D 4 1 6 bb 
    r5 Blank 2 3 4 aa 
    r6 Blank 3 4 5 bb 

我想減去C2,C3,以及使用該C5因子從A,B,和C C1 = 「空白」 列的C4值定義使用哪些空白值(aa或bb)。我想從共享c5信息的所有行中減去「空白」值。 (我知道這是混亂來形容)

所以結果應該是這樣的:

 c1 c2 c3 c4 c5 
    r1 A -1 -1 -1 aa 
    r2 B -1 -1 -1 bb 
    r3 C 1 1 1 aa 
    r4 D 1 -3 1 bb 

我已經看到了做這樣的事情與單個列的ddply功能的工作,但我沒能夠擴展它以執行多列任務。我是一個小白雖然...

謝謝你的幫助!

回答

1

這是沒有測試過所有可能的情況,但應該給你一個想法:

df <- read.table(text = 
"c1 c2 c3 c4 c5 
r1 A 1 2 3 aa 
r2 B 2 3 4 bb 
r3 C 3 4 5 aa 
r4 D 4 1 6 bb 
r5 Blank 2 3 4 aa 
r6 Blank 3 4 5 bb", header = T) 

library(data.table) 
# separate dataset into two 
dt <- data.table(df, key = "c5") 
dt.blank <- dt[c1 == "Blank"] 
dt <- dt[c1 != "Blank"] 

# merge into resulting dataset 
dt.res <- dt[dt.blank] 

# update each column 
columns.count <- ncol(dt) 
for(i in 2:(columns.count-1)) { 
    dt.res[[i]] <- dt.res[[i]] - dt.res[[i + columns.count]] 
} 

# > dt.res 
# c1 c2 c3 c4 c5 i.c1 i.c2 i.c3 i.c4 
# 1: A -1 -1 -1 aa Blank 2 3 4 
# 2: C 1 1 1 aa Blank 2 3 4 
# 3: B -1 -1 -1 bb Blank 3 4 5 
# 4: D 1 -3 1 bb Blank 3 4 5 
+0

我轉換回data.frame(_dt.res2 < - data.frame(dt.res)_),所以我可以刪除「我」列。謝謝Bulat! – Alex

0

首先拆分數據,因爲沒有理由讓它們在單個數據結構中。然後應用功能:

# recreate your data 
df <- data.frame(rbind(c(1:3, "aa"), c(2:4, "bb"), c(3:5, "aa"), c(4,1,6, "bb"), c(2:4, "aa"), c(3:5, "bb"))) 
df[,1:3] <- apply(df[,1:3], 2, as.integer) 

# split it 
blank1 <- df[5,] 
blank2 <- df[6,] 
df <- df[1:4,] 

for (i in 1:nrow(df)) { 
    if (df[i,4] == "aa") {df[i,1:3] <- df[i,1:3] - blank1[1:3]} 
    else     {df[i,1:3] <- df[i,1:3] - blank2[1:3]} 
} 

有幾個不同的是運行循環,包括向量化。但這足夠了。我還認爲,沒有理由在初始數據結構中保留標籤「aa」或「bb」,這會使得這更簡單;但這是你的選擇。

+0

感謝您的快速反應亞歷克斯!我有aa bb的原因是因爲我的實際數據集有許多不同的級別,我希望執行此任務。我曾考慮將所有空白與其他行分開,但如果我不需要分別對每個匹配進行編碼,那就太好了...... – Alex

+0

@Alex您的評論對我沒有明確說明您的問題。實施更一般的搜索策略當然很容易;但您需要在OP中提供一個明確的問題。 –

+0

對不起Alex,我一直在描述我的問題... – Alex