2016-03-07 36 views
0

我有條件替換問題。假設我有以下代碼爲數據幀有條件地替換特定的行值

a=c("0","1","0","B","NA","NA","NA","NA","NA") 
b=c(0,1,0,0,1,0,1,0,1) 
c=c(0,0,0,0,1,0,0,1,1) 
d=c("0","1","0","0","1","0","B","NA","NA") 
dat=data.frame(rbind(a,b,c,d)) 
names(dat)=c("P1","P2","P3","P4","C1","C2","C3","C4","C5") 

現在我要替換P1的行值:P4與NA如果這些值中的一個是B和我也想更​​換C1的行值: C5與NA如果這些值之一是B.所以我想數據框看起來像這樣:

a=c(**"NA","NA","NA","NA"**,"NA","NA","NA","NA","NA") 
b=c(0,1,0,0,1,0,1,0,1) 
c=c(0,0,0,0,1,0,0,1,1) 
d=c("0","1","0","0",**"NA","NA","NA"**,"NA","NA") 
dat=data.frame(rbind(a,b,c,d)) 
names(dat)=c("P1","P2","P3","P4","C1","C2","C3","C4","C5") 

我希望這些問題是可以理解的,我希望得到任何幫助。

回答

0

考慮到dat是最​​初提供的數據框,我提供了一個比較冗長的代碼,以便更好地理解。希望能幫助到你。

dat2 <- data.frame() 
for(i in 1:nrow(dat)){ 

    datSubset <- with(dat, dat[i,]) 
    col.num.of.B <- which(datSubset == "B", arr.ind = T)[2] 
    if(is.na(col.num.of.B)){ 
    datSubset <- datSubset 
    } else if(col.num.of.B < 5) { 
    datSubset[,c(1:4)] <- NA 
    } else { 
    datSubset[,c(5:9)] <- NA 
    } 

    dat2 <- rbind(dat2, datSubset) 
} 

dat2 
# P1 P2 P3 P4 C1 C2 C3 C4 C5 

# a <NA> <NA> <NA> <NA> NA NA NA NA NA 
# b 0 1 0 0 1 0 1 0 1 
# c 0 0 0 0 1 0 0 1 1 
# d 0 1 0 0 <NA> <NA> <NA> <NA> <NA> 
+0

謝謝兩位。這正是我所需要的:) – Lilly

+0

@Lilly - 如果答案對你的問題是公平的,請把它標記爲正確的答案。 :) – GAURAV

0

據我所知......如果在列P1到P4中發現值B,那麼將P1到P4內的所有值設置爲NA

你可以試試:

nm <- c("P1", "P2", "P3", "P4") 
cols <- which(names(dat) %in% nm) 
dat[,cols][any(dat[,cols] == "B")] <- NA 

dat 
# P1 P2 P3 P4 C1 C2 C3 C4 C5 
# a NA NA NA NA NA NA NA NA NA 
# b NA NA NA NA 1 0 1 0 1 
# c NA NA NA NA 1 0 0 1 1 
# d NA NA NA NA 1 0 B NA NA 

如果你想這僅適用於第一行,然後使用dat[1,cols][any(dat[,cols] == "B")] <- NA