在R中将NAs转换为0,将非NA的值转换为1

4

我在将一个包含NAs和不同数值的表格转换为NAs为0,所有数值为1时遇到了困难。

表格如下:

x    y    z
NA   8    NA
2    NA   NA
9    9    8
...

我能够使用以下代码将NAs转换为0:

data[is.na(data)] <- 0

但是我无法一次转换所有列的其他值。


1
replace(replace(tbl, !is.na(tbl), 1), is.na(tbl), 0) - d.b
2
如果数据值为 NA,则返回 0,否则返回 1。 - MFR
1
data[] = lapply(data, function(x) as.numeric(!is.na(x))) - Gregor Thomas
类似于@Gregor:(!is.na(tbl)) * 1 - d.b
2
@Gregor - 前面的否定符号适用于整个表达式。is.na(tbl) * 1会先完成,然后是否定。因此,您实际上是将其转换为逻辑值,然后转换为数字,再转换回逻辑值。 - Rich Scriven
显示剩余2条评论
3个回答

5
你可以使用简单的ifelse(一行代码)来实现这个功能:
data <- data.frame(ifelse(is.na(data),0,1))

甚至更简单:

+!is.na(data)

两者都能给您带来以下好处:

##   x y z
## 1 0 1 0
## 2 1 0 0
## 3 1 1 1

数据:

data <- structure(list(x = c(NA, 2L, 9L), y = c(8L, NA, 9L), z = c(NA,               
     NA, 8L)), .Names = c("x", "y", "z"), row.names = c(NA, 3L), class = "data.frame")

1
请注意,+(!is.na(data)) 返回一个矩阵。 - Rich Scriven
1
@RichScriven 是的,但我们实际上不知道OP是否有一个矩阵、数据表、数据框或其他结构,因为他/她没有发布结构。 - M--

4

按照你在例子中提到的相同方法进行操作:

# example data
df = data.frame(x = c(5,4,NA),
                y = c(NA,3,9))

df

#    x  y
# 1  5 NA
# 2  4  3
# 3 NA  9

df[!is.na(df)] = 1
df[is.na(df)] = 0

#   x y
# 1 1 0
# 2 1 1
# 3 0 1

首先将所有非NA值替换为1,然后将(剩余的)NA替换为0。 如果您首先替换NA,则所有值都将是非NA值,最终您将得到一个充满1的数据框。


2
data <- matrix(data = c(1:9),nrow = 3, ncol = 3)
data[3,3] <- NA

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6   NA

data[data > 0] <- 1
data[is.na(data)] <- 0

      [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    0

3
AntoniosK的命令(首先替换非NA值)更为通用——如果存在0或负数,应将其变为1,如果首先将NA更改为0,则会漏掉NA。 - Gregor Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接