如何在R中将数据更改为二进制并保留行名称列?

时间:2017-04-17 10:32:04

标签: r dataframe binary

我有一个看起来像这样的数据框

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)

我想转换所有值&gt; 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

那么我如何只将值更改为二进制而不是行名?

4 个答案:

答案 0 :(得分:3)

我们可以创建逻辑矩阵并强制转换为二进制

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

答案 1 :(得分:2)

作为@akrun(+1)给出的答案的替代方案,我们也可以尝试使用sapply()将任何非零数字逻辑转换为10

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")]或类似的东西来处理数字列。

答案 2 :(得分:1)

如果数字为负数或正数,您也可以尝试这一点:

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

答案 3 :(得分: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