我有一个看起来像这样的数据框
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
那么我如何只将值更改为二进制而不是行名?
答案 0 :(得分:3)
我们可以创建逻辑矩阵并强制转换为二进制
mydata[-1] <- +(mydata[-1] > 0)
答案 1 :(得分: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")]
或类似的东西来处理数字列。
答案 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