كيفية إنشاء عمود يحتوي على سلسلة من النجوم لتصفية مستويات العامل في إطار البيانات في r
سؤال
(السؤال الثاني اليوم - يجب أن يكون يومًا سيئًا)
لديّ بيانات بيانات ذات أعمدة مختلفة ، وتجنب عمود تركيز (رقمي) ، وعلم يسلط الضوء على نتائج غير صالحة (منطقية) ووصف للمشكلة (الحرف)
df <- structure(list(x = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), rawconc = c(77.4,
52.6, 86.5, 44.5, 167, 16.2, 59.3, 123, 1.95, 181), reason = structure(c(NA,
NA, 2L, NA, NA, NA, 2L, 1L, NA, NA), .Label = c("Fails Acceptance Criteria",
"Poor Injection"), class = "factor"), flag = c("False", "False",
"True", "False", "False", "False", "True", "True", "False", "False"
)), .Names = c("x", "rawconc", "reason", "flag"), row.names = c(NA,
-10L), class = "data.frame")
يمكنني إنشاء عمود مع المستوى الرقمي لعمود السبب
df$level<-as.numeric(df$reason)
df
x rawconc reason flag level
1 1 77.40 <NA> False NA
2 2 52.60 <NA> False NA
3 3 86.50 Poor Injection True 2
4 4 44.50 <NA> False NA
5 5 167.00 <NA> False NA
6 6 16.20 <NA> False NA
7 7 59.30 Poor Injection True 2
8 8 123.00 Fails Acceptance Criteria True 1
9 9 1.95 <NA> False NA
10 10 181.00 <NA> False NA
وإليك ما أريد أن أفعله لإنشاء عمود مع العديد من النجوم ، لكنه يفشل
df$stars<-paste(rep("*",df$level)sep="",collapse="")
Error: unexpected symbol in "df$stars<-paste(rep("*",df$level)sep"
df$stars<-paste(rep("*",df$level),sep="",collapse="")
Error in rep("*", df$level) : invalid 'times' argument
rep("*",df$level)
Error in rep("*", df$level) : invalid 'times' argument
df$stars<-paste(rep("*",pmax(df$level,0,na.rm=TRUE)),sep="",collapse="")
Error in rep("*", pmax(df$level, 0, na.rm = TRUE)) :
invalid 'times' argument
يبدو أن مندوب يحتاج إلى تغذية قيمة واحدة في وقت واحد. أشعر أن هذا يجب أن يكون ممكنًا (ويقول أمعائي "استخدم lapply" لكن تطبيق fu هو v. فقير)
أي شخص يريد المحاولة؟
المحلول
أعتقد أنك ستحتاج إلى وظيفة تطبيق. هذا سيفي بالغرض:
df[is.na(df$level),"level"] <- 0
df$level <- sapply(df$level, function(x) paste(rep("*",x),collapse=""))
من الأفضل استخدامك sapply
من lapply
في هذه الحالة لأنه يعيد ناقل بدلاً من القائمة.
من مساعدة مندوب:
إذا كانت "الأوقات" تتكون من عدد صحيح واحد ، فإن النتيجة تتكون من المدخلات بأكملها كرر هذا عدة مرات. إذا كانت "الأوقات" متجهًا بنفس طول "X" (بعد النسخ المتماثل بواسطة "كل") ، تتكون النتيجة من "X [1] مرات متكررة [1] "،" X [2] "المتكررة "الأوقات [2] وهلم جرا.
مشكلة واحدة في استخدام rep
مع ناقل المعلمة Times هو أنه يعيد ناقلًا ويتجاهل الحالات التي يكون فيها الأوقات = 0. يمكنك رؤية هذا مع هذا الأمر: rep(rep("*", nrow(df)), times=df$level)
.
نصائح أخرى
يمكنك إنشاء ناقلات النجوم
vstars <- sapply(1L:nlevels(df$reason), function(i) paste(rep("*",i),collapse=""))
vstars
# [1] "*" "**"
ثم فهرسته مع df$reason
(الذي يعمل لأنه عامل):
vstars[df$reason]
# [1] NA NA "**" NA NA NA "**" "*" NA NA
لكبير data.frame
يجب أن يكون أسرع بكثير paste
في كل صف.