替换值

时间:2016-05-11 04:24:25

标签: r

我有两个变量transID和transid

transID        transid
fsdfsdgls         NA
dfdsfgdsgs     mksdjfl
werwer         fgsdsdg
xcvcxvx           NA

我希望输出像

transID         transid
fsdfsdgls          NA 
mksdjfl         mksdjfl 
fgsdsdg         fgsdsdg
xcvcxvx           NA

我想用transid替换transID中的值,当它不是NA时

2 个答案:

答案 0 :(得分:2)

由于只有两个选项,您可以使用一个ifelse()

df <- data.frame(transID=c('fsdfsdgls','dfdsfgdsgs','werwer','xcvcxvx'),transid=c(NA,'mksdjfl','fgsdsdg',NA),stringsAsFactors=F);
df$transID <- ifelse(is.na(df$transid),df$transID,df$transid);
df;
##     transID transid
## 1 fsdfsdgls    <NA>
## 2   mksdjfl mksdjfl
## 3   fgsdsdg fgsdsdg
## 4   xcvcxvx    <NA>

另一种可能性,通过预先计算哪些索引需要替换:

i <- which(!is.na(df$transid));
df$transID[i] <- df$transid[i];
df;
##     transID transid
## 1 fsdfsdgls    <NA>
## 2   mksdjfl mksdjfl
## 3   fgsdsdg fgsdsdg
## 4   xcvcxvx    <NA>

答案 1 :(得分:1)

我们可以使用data.table以更快的方式执行此操作,因为:=执行此操作。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)),在&#39; i&#39;中指定逻辑条件。 (!is.na(transid))并指定(:=)&#39; transid&#39;对应于&#39; i&#39;中的TRUE值的值到&#39; transID&#39;列。

library(data.table)
setDT(df)[!is.na(transid), transID := transid]
df
#     transID transid
#1: fsdfsdgls      NA
#2:   mksdjfl mksdjfl
#3:   fgsdsdg fgsdsdg
#4:   xcvcxvx      NA

数据

df <- structure(list(transID = c("fsdfsdgls", "dfdsfgdsgs", "werwer", 
"xcvcxvx"), transid = c(NA, "mksdjfl", "fgsdsdg", NA)),
.Names = c("transID", "transid"), class = "data.frame",
row.names = c(NA, -4L))