我有两个变量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时
答案 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))