Совместное использование startWith и paste0 - PullRequest
1 голос
/ 07 мая 2020

У меня есть фрейм данных, подобный следующему:

Frequency  Period No.  Period
Q1         3
Q2         6
Q3         9 

Если значение в столбце Frequency начинается с "Q", я хочу, чтобы столбец Period был заполнен соответствующим кварталом (т.е. если частота Q1, Период Q1). Я НЕ хочу, чтобы это было сделано путем простой вставки значений из столбца Frequency в столбец Period.

Сейчас я пытаюсь использовать startWith и paste0 для этого:

df$Frequency[startsWith(df$Frequency, "Q")] <- paste0("Q", (df$`Period No.`)-1)%/%3+1)

Я получаю сообщение об ошибке

Error in startsWith(df$Frequency, "Q") : 
  non-character object(s)

Может ли кто-нибудь помочь с этой проблемой?

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Мы могли бы использовать case_when или ifelse или простое присваивание с индексом

i1 <- grepl("^Q\\d+", df$Frequency)
df$Period[i1] <- df$`Period No.`[i1]
0 голосов
/ 07 мая 2020

кажется, что символы вашего фрейма данных анализируются как фактор, что означает, что они являются скрытыми целыми числами.

, чтобы избежать этого, вы можете либо поставить параметр stringsAsFactors = FALSE, когда вы читаете, либо создаете data.frame ... Или обновитесь до версии 4.0, которая только что удалила это поведение по умолчанию;)

Тогда вы, вероятно, столкнетесь с другой проблемой, потому что вам нужно подмножество правой стороны df $ Period No., чтобы иметь такое же количество наблюдений, как в левой части.

пример разрешения, повторный анализ коэффициента как символов:

df <- data.frame(a=c("john","jane","pamela","jessica"),b=1:4)
df$a <- as.character(df$a)
boolean <- startsWith(df$a,"j")
df[boolean,"a"] <- df[boolean,"b"]
...