有条件地将一列替换为另一列 ( R )
Conditional replacement of one column by another ( R )
因此,可以将 col 和 prob 视为一个包;他们一起去,例如,col2 "goes with" prob2.
如何才能让col
中的单元格为<NA>
时,对应的prob
也会被替换为<NA>
?
数据:
col2 prob2 col3 prob3 col4 prob4 col5 prob5
2 0.126269620610401 <NA> 0.979143074247986 <NA> 0.150689669651911 <NA> 0.11148908524774
3 0.730431054253131 <NA> 0.826114872703329 <NA> 0.368350319797173 <NA> 0.299717969959602
2 0.320544729940593 3 0.0434977798722684 4 0.859434255165979 11 0.150506388396025
2 0.0354198240675032 3 0.240764779038727 5 0.276169682852924 <NA> 0.0449998050462455
目标:
col2 prob2 col3 prob3 col4 prob4 col5 prob5
2 0.126269620610401 <NA> <NA> <NA> 0.150689669651911 <NA> <NA>
3 0.730431054253131 <NA> <NA> <NA> 0.368350319797173 <NA> <NA>
2 0.320544729940593 3 0.0434977798722684 4 0.859434255165979 11 0.150506388396025
2 0.0354198240675032 3 0.240764779038727 5 0.276169682852924 <NA> <NA>
如果同一行中的 col3
值为 NA,这将用 NA 替换 prob3
值:
dat$prob3 = ifelse(is.na(dat$col3), NA, dat$prob3))
在之前的答案的基础上,这是一种在所有列-概率对中以编程方式执行此操作的方法:
x <- data.frame(col2 = c(NA, NA, 1,2), prob2 = runif(4), col3 = c(3,4,NA,NA), prob3 = rnorm(4))
colColumns <- grep("col", names(x))
for (j in colColumns) {
x[ j+1] <- ifelse(is.na(x[, j]), NA, x[, j+1])
}
结果整数:
col2 prob2 col3 prob3
1 NA NA 3 1.359170
2 NA NA 4 1.165798
3 1 0.2701173 NA NA
4 2 0.6411366 NA NA
您可以使用 is.na.data.frame
创建一个结果,该结果被 is.na<-
用于 "NA-out" "prob" 列中的相应值:
is.na(dat[ , grep("prob", colnames(dat)) ]) <- is.na(dat[ , grep("col", colnames(dat)) ])
#------------------
> dat
col2 prob2 col3 prob3 col4 prob4 col5 prob5
1 2 0.12626962 <NA> NA <NA> NA <NA> NA
2 3 0.73043105 <NA> NA <NA> NA <NA> NA
3 2 0.32054473 3 0.04349778 4 0.8594343 11 0.1505064
4 2 0.03541982 3 0.24076478 5 0.2761697 <NA> NA
请注意,这使用了您的控制台输出,并且它作为任何“<NA>
-containing”列作为因子列出现。这可能是您的 ?col? 变量的问题,因为带有 NA 的真实数字向量不会显示为 <NA>
因此,可以将 col 和 prob 视为一个包;他们一起去,例如,col2 "goes with" prob2.
如何才能让col
中的单元格为<NA>
时,对应的prob
也会被替换为<NA>
?
数据:
col2 prob2 col3 prob3 col4 prob4 col5 prob5
2 0.126269620610401 <NA> 0.979143074247986 <NA> 0.150689669651911 <NA> 0.11148908524774
3 0.730431054253131 <NA> 0.826114872703329 <NA> 0.368350319797173 <NA> 0.299717969959602
2 0.320544729940593 3 0.0434977798722684 4 0.859434255165979 11 0.150506388396025
2 0.0354198240675032 3 0.240764779038727 5 0.276169682852924 <NA> 0.0449998050462455
目标:
col2 prob2 col3 prob3 col4 prob4 col5 prob5
2 0.126269620610401 <NA> <NA> <NA> 0.150689669651911 <NA> <NA>
3 0.730431054253131 <NA> <NA> <NA> 0.368350319797173 <NA> <NA>
2 0.320544729940593 3 0.0434977798722684 4 0.859434255165979 11 0.150506388396025
2 0.0354198240675032 3 0.240764779038727 5 0.276169682852924 <NA> <NA>
如果同一行中的 col3
值为 NA,这将用 NA 替换 prob3
值:
dat$prob3 = ifelse(is.na(dat$col3), NA, dat$prob3))
在之前的答案的基础上,这是一种在所有列-概率对中以编程方式执行此操作的方法:
x <- data.frame(col2 = c(NA, NA, 1,2), prob2 = runif(4), col3 = c(3,4,NA,NA), prob3 = rnorm(4))
colColumns <- grep("col", names(x))
for (j in colColumns) {
x[ j+1] <- ifelse(is.na(x[, j]), NA, x[, j+1])
}
结果整数:
col2 prob2 col3 prob3
1 NA NA 3 1.359170
2 NA NA 4 1.165798
3 1 0.2701173 NA NA
4 2 0.6411366 NA NA
您可以使用 is.na.data.frame
创建一个结果,该结果被 is.na<-
用于 "NA-out" "prob" 列中的相应值:
is.na(dat[ , grep("prob", colnames(dat)) ]) <- is.na(dat[ , grep("col", colnames(dat)) ])
#------------------
> dat
col2 prob2 col3 prob3 col4 prob4 col5 prob5
1 2 0.12626962 <NA> NA <NA> NA <NA> NA
2 3 0.73043105 <NA> NA <NA> NA <NA> NA
3 2 0.32054473 3 0.04349778 4 0.8594343 11 0.1505064
4 2 0.03541982 3 0.24076478 5 0.2761697 <NA> NA
请注意,这使用了您的控制台输出,并且它作为任何“<NA>
-containing”列作为因子列出现。这可能是您的 ?col? 变量的问题,因为带有 NA 的真实数字向量不会显示为 <NA>