2013-11-21 50 views
1

我對數據框中的升級值有疑問。數據幀如下所示:在數值數據框中將值+1更新

P1 P2 P3 P4 P5 P6 
A 1 0 0 0 0 0 
B 0 1 0 0 0 0 
C 0 0 1 0 0 1 
D 0 0 0 0 1 0 
E 1 0 0 0 0 0 
F 0 0 0 1 1 0 

我的問題是,我想升級一些值+1。這意味着我有一個變量P1_upgrade,其中包含需要升級+1的行。任何人都可以幫我解決這個問題嗎?最後一欄必須像下面列:

> P1_upgrade <- "E" 
> P3_upgrade <- "C" 
> P5_upgrade <- c("D","D","F") 


    P1 P2 P3 P4 P5 P6 
A 1 0 0 0 0 0 
B 0 1 0 0 0 0 
C 0 0 2 0 0 1 
D 0 0 0 0 3 0 
E 2 0 0 0 0 0 
F 0 0 0 1 2 0 
+0

如果數據框中的每一列都是相同的類型(在這種情況下總是數字),那麼使用矩陣就更好了,正如Як在他的回答中所表明的那樣。 –

回答

0

如果你改變你存儲的變量更新的方法這個問題可以被簡化了不少,如:

dat <- structure(c(1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(6L, 6L), 
.Dimnames = list(c("A", "B", "C", "D", "E", "F"), c("P1","P2", "P3", "P4", "P5", "P6"))) 

將您的升級記錄在data.frame中。將相關項目存儲在單個對象(如listdata.frame)中有幾個優點,如果您發現需要對所有項目應用通用更改,則可以避免在多個項目上處理複雜循環的需要。

upg <- mget(ls(pattern="_upgrade")) 
names(upg) <- gsub("_upgrade","",names(upg)) 
upg <- data.frame(
     row=unlist(upg), 
     col=rep(names(upg),sapply(upg,length)), 
     count=1, 
     stringsAsFactors=FALSE 
     ) 

# row col count 
#P1 E P1  1 
#P3 C P3  1 
#P51 D P5  1 
#P52 D P5  1 
#P53 F P5  1 

aggregate升級的行/列索引:

upg <- aggregate(count ~ row + col , data=upg, sum) 

# row col count 
#1 E P1  1 
#2 C P3  1 
#3 D P5  2 
#4 F P5  1 

添加升級值(雖然你將需要改變datmatrix第一這個工作):

dat <- as.matrix(dat) 
dat[ as.matrix(upg[1:2]) ] <- (dat[ as.matrix(upg[1:2]) ] + upg$count) 

# P1 P2 P3 P4 P5 P6 
#A 1 0 0 0 0 0 
#B 0 1 0 0 0 0 
#C 0 0 2 0 0 1 
#D 0 0 0 0 3 0 
#E 2 0 0 0 0 0 
#F 0 0 0 1 2 0 
+0

尊敬的thelatemail,我想對大數據集使用這種方法。因此我需要找到一個函數來創建upg數據幀。你能幫助我嗎? – Lisann

+0

@Lisann - 你想從哪裏創建'upg' data.frame?它只是「P1_upgrade」,「P3_upgrade」等矢量?如果是這樣,請參閱我的編輯以瞭解如何執行此操作。 – thelatemail

+0

謝謝!這對我來說很好! :) – Lisann

0
> m <- matrix(rep(0,25),ncol=5) 

> df <- as.data.frame(m) 

> row.names(df) <- c("a","b","c","d","e") 

> df 

    V1 V2 V3 V4 V5 
a 0 0 0 0 0 
b 0 0 0 0 0 
c 0 0 0 0 0 
d 0 0 0 0 0 
e 0 0 0 0 0 

> up <- c("b","b","c") 

# return value to dump b/c we're not interested in it and don't 
# want have it clutter the terminal 

> dump <- sapply(up, function(r) df[r,] <<- df[r,] + 1) 

> df 

    V1 V2 V3 V4 V5 
a 0 0 0 0 0 
b 2 2 2 2 2 
c 1 1 1 1 1 
d 0 0 0 0 0 
e 0 0 0 0 0 
+0

由於潛在的非預期副作用,請小心使用<< - - '。請參閱http://stackoverflow.com/a/5785757/496803 – thelatemail