У меня две переменные 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

r
2
63549 11 Май 2016 в 07:24

2 ответа

Лучший ответ

Мы можем использовать data.table, чтобы сделать это быстрее, поскольку := делает это на месте. Преобразуйте data.frame в data.table (setDT(df)), укажите логическое условие в 'i' (!is.na(transid)) и назначьте (:=) значения 'transid', соответствующие к ИСТИННЫМ значениям в столбце от «i» до «transID».

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))
1
akrun 11 Май 2016 в 05:00

Поскольку есть только два варианта, вы можете использовать один 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>
2
bgoldst 11 Май 2016 в 04:32