أداء وظيفة الثنائية إلى عمود في إطار بيانات
سؤال
ويقول لدي الإطار البيانات مع محتويات:
Trial Person
1 John
2 John
3 John
4 John
1 Bill
2 Bill
3 Bill
4 Bill
ووأريد أن تحويل هذا إلى
Trial Person Day
1 John 1
2 John 1
3 John 2
4 John 2
1 Bill 1
2 Bill 1
3 Bill 2
4 Bill 2
وأنا يمكن أن تجعل من السهل جدا أن
Trial Person Day
1 John TRUE
2 John TRUE
3 John FALSE
4 John FALSE
1 Bill TRUE
2 Bill TRUE
3 Bill FALSE
4 Bill FALSE
وعن طريق القيام d$day=d$trial<3
ولكن كيف يمكن أن أحصل على ما أريد؟
المحلول
إذا كنت تريد أن تكون صريحة مع التنازل (ويصعب ترميز قطع من 3)، يمكنك استخدام
d$Day <- ifelse(d$trial<3, 1, 2)
وهذا هو قليلا أكثر شفافية. خلاف ذلك، كما يمكنك اكتشاف، والقيام بعملية حسابية سيتم تحويل قيمة منطقية إلى رقمية. يمكنك أن تفعل ذلك بنفسك باستخدام as.numeric
أو as.integer
:
as.integer(FALSE) #0
as.integer(TRUE) #1
نصائح أخرى
والحصول على البيانات:
x <- read.table(textConnection(
"Trial Person
1 John
2 John
3 John
4 John
1 Bill
2 Bill
3 Bill
4 Bill"), header=TRUE)
وأعتقد أن النهج الحالي هو حق واحد (ملاحظة: لا تحتاج as.numeric، لأنه يلقي تلقائيا عند القيام إلى ذلك في هذه الحالة):
(x$Trial >= 3) + 1
وعلى خلاف ذلك، وهنا طريقة للقيام بذلك مع plyr.
library(plyr)
ddply(x, .(Person), transform, Day=rep(c(1,2), each=2))
وبصورة أعم، إذا كنت تحاول تحويل ناقلات النموذج c(1,2,3,4,5,6)
إلى c(1,1,2,2,3,3)
، كما لو كان لديك تجربتين في اليوم الواحد، فإنك قد ترغب في التعبير عن هذا التقسيم صحيح باستخدام:
> x <- 1:6
> x
[1] 1 2 3 4 5 6
> (x-1) %/% 2 + 1
[1] 1 1 2 2 3 3
وطيب، حتى لقد وجدت الحل، إذا كنت تفعل
(d$trial>=3)+1
وويحوله منطقية إلى عدد صحيح وأنه يعمل ... ومع ذلك، هناك طريقة أفضل للقيام بذلك؟