استبدال القيم باستخدام إفليلز في R



vote online (2)

لدي سؤال تافهة جدا مع البيانات على النحو التالي:

sample<-list(c(10,12,17,7,9,10),c(NA,NA,NA,10,12,13),c(1,1,1,0,0,0))
sample<-as.data.frame(sample)
colnames(sample)<-c("x1","x2","D")

>sample
x1  x2  D
10  NA  1
12  NA  1
17  NA  1
7   10  0
9   20  0
10  13  0

ملاحظة: عدد الملاحظات مع D = 1 هو نفس D = 0

الآن، أريد إنشاء متغير x3 يحتوي على قيم تتعلق D=0 عندما D=1 والقيم المتعلقة D=1 عندما D=0 . الناتج المتوقع:

x1  x2  D   x3
10  NA  1   10
12  NA  1   20
17  NA  1   13
7   10  0   NA
9   20  0   NA
10  13  0   NA

حاولت استخدام وظيفة ifelse النحو التالي:

sample.data$x3<-with(sample.data, ifelse(D==1,x2[which(D==0)],x2[which(D==1)]))

حصلت على الخطأ التالي:

logical(0)

كما حاولت ما يلي:

sample.data$x3<-with(sample.data, ifelse(D==1,tail(x2,3),head(x2,3)))

مرة أخرى، حصلت على نفس الخطأ:

logical(0)

أي فكرة عما يجري هنا؟

https://src-bin.com


Answer #1

المنطق في الأمر الخاص بك هو الصوت، ولكن كنت تشير إلى داتافريم بشكل غير صحيح. تحتاج فقط إلى إزالة .data بعد sample جميع أنحاء سطر التعليمات البرمجية. لذلك هذا الأمر سوف تعطيك ما تحتاجه:

sample$x3<-with(sample,ifelse(D==1,x2[which(D==0)],x2[which(D==1)]))

هذا الرمز لا يزال قليلا مطول قليلا.

كما لاحظتArun في التعليقات، لا تحتاج إلى تضمين وظيفة () عند تحديد قيم x2 لاستخدامها نتيجة ifelse الخاص بك. سوف تعطيك التعليمات البرمجية التالية نتائج متطابقة:

sample$x3<-with(sample,ifelse(D==1,x2[D==0],x2[D==1]))

Answer #2

هل تعرف data.table ، وهنا هو الحل معها ...

install.packages("data.table")
library(data.table)

sample = as.data.table(sample)
sample[,x4:=ifelse(D==1,x2[D==0],x2[D==1])]