我的数据集是:
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 。
基准测试总结:
as.integer
和 +
几乎是相辅相成的,所以我想你知道我的建议在哪里。 关于r - 将缺失/非缺失值更改为二进制 (0/1),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35277378/