2017-04-17 39 views
2

我有看起來像這樣如何在R中將數據更改爲二進制並保留行名稱列?

Site <- c("X1","X2","X3","X4","X5","X6","X7","X8","X9","X10") 
A <- c(0,0,1,2,4,5,6,7,13,56) 
B <- c(1,0,0,0,0,4,5,7,7,8) 
C <- c(2,3,0,0,4,5,67,8,43,21) 
D <- c(134,0,0,2,0,0,9,0,45,55) 
mydata <- data.frame(Site,A,B,C,D,stringsAsFactors=FALSE) 

欲所有值> 0轉換爲1(即二進制),而不會危害列和行的名稱的數據幀。

我試圖mydata[mydata>=1]<-1但它也改變了我的第一列(行名稱)1,以及:

head(mydata) 
    Site A B C D 
1 1 0 1 1 1 
2 1 0 0 1 0 
3 1 1 0 0 0 
4 1 1 0 0 1 
5 1 1 0 1 0 
6 1 1 1 1 0 

那麼,如何改變只值以二進制的,而不是排名字?

+1

轉換爲二進制心不是剛剛轉換> = 1比1,其也轉換<1到0你的例子不改變負數。 – Spacedman

回答

3

我們可以創建一個邏輯矩陣和強迫二進制

mydata[-1] <- +(mydata[-1] > 0) 
+0

請注意,這與**「將所有值> 0轉換爲1」**並不相同,因爲它也將任何值<1轉換爲0.可能是提問者希望數字小於1,即0 **和負數**,單獨留下,或者0是可能的最小數字(因爲也許是它的計數數據),並且像這樣的邏輯重新分配是可以接受的。 – Spacedman

+0

@Spacedman謝謝,我改變了它 – akrun

+0

@Spacedman是的,對不起,我應該在問題中說。我的數據是計數數據,因此它沒有負值 –

2

作爲替代由@akrun(+1)給出了答案,我們也可以嘗試使用sapply()到邏輯轉換任何非零數字到1否則0

mydata[-1] <- sapply(mydata[-1], function(x) { as.numeric(x > 0) }) 
mydata 
    Site A B C D 
1 X1 0 1 1 1 
2 X2 0 0 1 0 
3 X3 1 0 0 0 
4 X4 1 0 0 1 
5 X5 1 0 1 0 
6 X6 1 1 1 0 
7 X7 1 1 1 1 
8 X8 1 1 1 0 
9 X9 1 1 1 1 
10 X10 1 1 1 1 

如果我們不知道列的相對定位,我們也可以解決使用mydata[c("A", "B", "C", "D")]或類似的東西的數字列。

+0

非常感謝。列的相對位置是已知的,我的真實數據有5000列,所以我不認爲說出他們的名字是一個好主意。你的回答很好。謝謝。 –

1

您也可以嘗試這裏面忽略,如果該數字爲負或正:

mydata[-1] <- (!is.na(mydata[-1]/mydata[-1]))*1 
0

ifelse功能允許您如果該值同意或不同意你的條件指定新的數據。適用於矢量,但也適用於數據框。我將Site列與轉換後的列綁定。

myBinData <- data.frame(Site = mydata$Site, ifelse(mydata[, -1] == 0, 0, 1))

Site A B C D 1 X1 0 1 1 1 2 X2 0 0 1 0 3 X3 1 0 0 0 4 X4 1 0 0 1 5 X5 1 0 1 0 6 X6 1 1 1 0 7 X7 1 1 1 1 8 X8 1 1 1 0 9 X9 1 1 1 1 10 X10 1 1 1 1

+0

你能爲你的答案添加一些解釋嗎? – thanksd

+0

嗯,這是我不想要的,因爲第一列也變成了1s –

+0

哦,對不起。我更改了thar @TungLinh的代碼。 –

相關問題