如果BOTH列= NA,如何将更改变量更改为0

时间:2018-03-28 03:21:47

标签: r

在下面的R数据框中,我想将两列= NA的所有实例替换为两列= 0

所以我想改变这个:

Col 1   Col 2
   1       1
   3       2
  NA      NA
   3      NA
  NA       3
  NA      NA

并希望结果为:

Col 1   Col 2
   1       1
   3       2
   0       0
   3      NA
  NA       3
   0       0

2 个答案:

答案 0 :(得分:1)

一种选择是在逻辑矩阵(resource "aws_db_instance" "test" { identifier = "test" allocated_storage = 1 storage_type = "aurora" engine = "aurora" engine_version = "5.6.10a" instance_class = "db.t2.small" name = "testdb" username = "testadmin" password = "xxxxx" port = 3306 publicly_accessible = false availability_zone = "us-east-2a" security_group_names = [] vpc_security_group_ids = ["sg-xxxxx"] db_subnet_group_name = "default-vpc-xxxxx" parameter_group_name = "default.aurora5.6" multi_az = false backup_retention_period = 1 #backup_window = "08:48-09:18" #maintenance_window = "sun:08:56-sun:09:26" final_snapshot_identifier = "test-final" } 上创建一个rowSums的逻辑索引 - 这将为非NA提供!is.na(df1)值,为NA提供TRUE。通过执行FALSE,具有0个N的行(即全部为FALSE)将返回0,而其他行将大于0.否定(rowSums!将返回0,表示0和所有值其他FALSE)然后将行分配给0

vector

或者也可以通过不否定和与列数进行比较来以其他方式完成

另一种选择是遍历列,检查具有df1[!rowSums(!is.na(df1)),] <- 0 df1 # Col 1 Col 2 #1 1 1 #2 3 2 #3 0 0 #4 3 NA #5 NA 3 #6 0 0 的NA,然后is.na检查到逻辑Reduce以将基于它的TRUE行分配给0

vector

答案 1 :(得分:1)

如果您希望显式引用列,您也可以执行

df <- data.frame(col1=c(1, 3, NA, 3, NA, NA), col2=c(1, 2, NA, NA, 3, NA))
df[is.na(df$col1) & is.na(df$col2), ] <- 0
df
##  col1 col2
## 1    1    1
## 2    3    2
## 3    0    0
## 4    3   NA
## 5   NA    3
## 6    0    0

对于仅将特定列更改为零的情况,您可以通过括号内的索引或名称引用这些列。 E.g。

df <- data.frame(col1=c(1, 3, NA, 3, NA, NA), col2=c(1, 2, NA, NA, 3, NA), col3=rep(1, 6))
df[is.na(df$col1) & is.na(df$col2), c("col1", "col2")] <- 0
df
##   col1 col2 col3
## 1    1    1    1
## 2    3    2    1
## 3    0    0    1
## 4    3   NA    1
## 5   NA    3    1
## 6    0    0    1