كيفية إنشاء عمود يحتوي على سلسلة من النجوم لتصفية مستويات العامل في إطار البيانات في r

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

  •  24-09-2019
  •  | 
  •  

سؤال

(السؤال الثاني اليوم - يجب أن يكون يومًا سيئًا)

لديّ بيانات بيانات ذات أعمدة مختلفة ، وتجنب عمود تركيز (رقمي) ، وعلم يسلط الضوء على نتائج غير صالحة (منطقية) ووصف للمشكلة (الحرف)

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 في كل صف.

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