Как создать колонку, содержащую строку звезд, чтобы неидицитные уровни фактора в рамках данных в R

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

  •  24-09-2019
  •  | 
  •  

Вопрос

(второй вопрос сегодня - должен быть плохой день)

У меня есть dataframe с различными столбцами, влюблен в колонну концентрации (числовой), флаг, подчеркивающий недействительные результаты (логические) и описание проблемы (символ)

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 В этом случае, поскольку он возвращает вектор вместо списка.

От помощи для представления:

Если «Times» состоит из одного целого числа, результат состоит из всего ввода, повторяется так много раз. Если «Times» - это вектор того же длины, что и «X» (после репликации по «каждой»), результат состоит из «х [1]« повторяющихся »раз [1] раз,« х [2] »повторяется 'Times [2] раз и так далее.

Одна проблема с использованием rep С вектором для параметра Time 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