2017-04-20 123 views
-4

如何在第一行中將「N」的第2到第7個值替換爲「Y」?第一個值保持爲 「N」R根據指定的條件在多列中替換值?

 SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090 
1  N  N  N  N  N  N  N 
2  N  N  N  N  N  N  Y 
3  N  N  N  N  N  Y  N 

我的願望outcone是:

1  N  Y  Y  Y  Y  Y  Y 

非常感謝,

A.

回答

1
a <- read.table("a.txt", sep = '\t', header=TRUE, stringsAsFactors=FALSE) 
a 
    SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090 
1  N  N  N  N  N  N  N 
2  N  N  N  N  N  N  Y 
3  N  N  N  N  N  Y  N 
a[1,2:7] <- "Y" 
a 
    SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090 
1  N  Y  Y  Y  Y  Y  Y 
2  N  N  N  N  N  N  Y 
3  N  N  N  N  N  Y  N 

好吧,這是一個有點棘手,但可能去做。我將編輯這個答案。我們只想在第2列:7行中將N更改爲Y,我們只有N,所以我添加了新列,其值爲FALSE和TRUE。如果行從列只有N 2:7值爲FALSE becase的我們還沒有我用

b$new <- apply(b[,2:7], 1, function(x) any(x %in% c("Y"))) 

    SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090 new 
1  N  N  N  N  N  N  N  FALSE 
2  N  N  N  N  N  N  Y  TRUE 
3  N  N  N  N  N  Y  N  TRUE 

那麼任何Y.如果我們在new列FALSE我們可以把值Y列2:7

b[,2:7][b$new==FALSE ,] <- "Y" 

所以我們有想要的結果。

 SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090 new 
1  N  Y  Y  Y  Y  Y  Y  FALSE 
2  N  N  N  N  N  N  Y  TRUE 
3  N  N  N  N  N  Y  N  TRUE 

彙總,在2列的值N在roww每個值:7將與Y. 當然我們不需要柱new因此我們可以通過

b$new <- NULL 

確定刪除它來代替,所以計數列occarances和barplot:

x <- apply(a, 2, table) 
y <- do.call(rbind, x) 

易ř儲存卡barplot

z <- as.data.frame(t(y)) 
barplot(data.matrix(z[1:2,]), col=c("darkblue","red"),beside=TRUE) 

enter image description here

X軸標籤將擴大,如果你自己繪製。

還有其他方法可以使用ggplot包得到這個圖,但我將不得不重新構建數據文件有點費時,歡呼!

>dat 
    SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090 
1  N  Y  Y  Y  Y  Y  Y 
2  N  N  N  N  N  N  Y 
3  N  N  N  N  N  N  N 
4  N  N  N  N  N  Y  N 
5  N  Y  N  Y  N  N  N 
6  Y  Y  Y  Y  Y  Y  Y 
dat$new <- apply(dat[,1:7], 1, function(x) all(x %in% c("Y") | all((x %in% c("N"))))) 
result <- dat[dat$new!=TRUE, ] 
result$new <- NULL 
> result 
    SOC_023 SOC_040 SOC_044 SOC_055 SOC_079 SOC_089 SOC_090 
1  N  Y  Y  Y  Y  Y  Y 
2  N  N  N  N  N  N  Y 
4  N  N  N  N  N  Y  N 
5  N  Y  N  Y  N  N  N 
+0

謝謝!我有幾百萬行的「Y」和「N」的不同組合......有沒有辦法找到所有列都有「N」並替換上面相同列中的值?非常感謝 ! – user2017716

+0

In a [1,2:7] < - 「Y」1是行數,2:7是列數。如果要在所有行中將N更改爲Y,並將第2列更改爲7,請鍵入a [,2:7] < - 「Y」。 – Adamm

+0

但是,它只適用於「N」行嗎?我不想改變其他組合的行,例如7「N」,例如N N N N N Y N ...謝謝千禧年 – user2017716