أداء وظيفة الثنائية إلى عمود في إطار بيانات

StackOverflow https://stackoverflow.com/questions/2254701

  •  20-09-2019
  •  | 
  •  

سؤال

ويقول لدي الإطار البيانات مع محتويات:

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

وويحوله منطقية إلى عدد صحيح وأنه يعمل ... ومع ذلك، هناك طريقة أفضل للقيام بذلك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top