我在将一个包含NAs和不同数值的表格转换为NAs为0,所有数值为1时遇到了困难。
表格如下:
x y z
NA 8 NA
2 NA NA
9 9 8
...
我能够使用以下代码将NAs转换为0:
data[is.na(data)] <- 0
但是我无法一次转换所有列的其他值。
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")
+(!is.na(data))
返回一个矩阵。 - Rich Scriven按照你在例子中提到的相同方法进行操作:
# 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的数据框。
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
replace(replace(tbl, !is.na(tbl), 1), is.na(tbl), 0)
- d.bdata[] = lapply(data, function(x) as.numeric(!is.na(x)))
- Gregor Thomas(!is.na(tbl)) * 1
- d.bis.na(tbl) * 1
会先完成,然后是否定。因此,您实际上是将其转换为逻辑值,然后转换为数字,再转换回逻辑值。 - Rich Scriven