我的数据集是:

df=data.frame(x=c(1,4,6,NA,7,NA,9,10,4,NA),
          y=c(10,12,NA,NA,14,18,20,15,12,17),
          z=c(225,198,NA,NA,NA,130,NA,200,NA,99))
df
    x  y   z
1   1 10 225
2   4 12 198
3   6 NA  NA
4  NA NA  NA
5   7 14  NA
6  NA 18 130
7   9 20  NA
8  10 15 200
9   4 12  NA
10 NA 17  99
我想将数据集更改为二进制数据集,如下所示
观察到的非 NA 值 -> 1
缺失,NA 值 -> 0
 x y z
1  1 1 1
2  1 1 1
3  1 0 0
4  0 0 0
5  1 1 0
6  0 1 1
7  1 1 0
8  1 1 1
9  1 1 0
10 0 1 1
如何在 R 中做到这一点?
我的训练代码是 ifelse(df=NA , 0 ,1)

最佳答案

您可以使用 !is.na ,如下所示:

# df[] <- as.numeric(!is.na(df))  # <- Original answer
df[] <- as.integer(!is.na(df))    # <- Thanks @docendodiscimus
df
#    x y z
# 1  1 1 1
# 2  1 1 1
# 3  1 0 0
# 4  0 0 0
# 5  1 1 0
# 6  0 1 1
# 7  1 1 0
# 8  1 1 1
# 9  1 1 0
# 10 0 1 1

如果考虑效率,您可以尝试使用“data.table”包:
as.data.table(df)[, lapply(.SD, function(x) as.numeric(!is.na(x)))]
#     x y z
#  1: 1 1 1
#  2: 1 1 1
#  3: 1 0 0
#  4: 0 0 0
#  5: 1 1 0
#  6: 0 1 1
#  7: 1 1 0
#  8: 1 1 1
#  9: 1 1 0
# 10: 0 1 1

或者在替换时分配:
as.data.table(df)[, (names(df)) := lapply(.SD, function(x) as.numeric(!is.na(x)))][]

更新

如果有人对进一步的基准测试感兴趣,您可以查看 this Gist

基准测试总结:
  • 如果您追求的是绝对的速度,请选择“data.table”方法。
  • 如果你想在基础 R 中使用高效的代码,as.integer+ 几乎是相辅相成的,所以我想你知道我的建议在哪里。
  • 关于r - 将缺失/非缺失值更改为二进制 (0/1),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35277378/

    10-12 18:00