一起使用 startsWith 和 paste0

Using startsWith and paste0 together

我有一个类似于以下的数据框:

Frequency  Period No.  Period
Q1         3
Q2         6
Q3         9 

如果频率列中的值以 "Q" 开头,我希望周期列填充相应的季度(即,如果频率为 Q1,则周期为 Q1)。我不希望通过简单地将频率列中的值粘贴到周期列来完成此操作。

我目前正在尝试使用 startsWith 和 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)

有人可以帮忙解决这个问题吗?

您的数据框字符似乎被解析为因子,这意味着它们是隐藏的整数。

为避免这种情况,您可以在阅读或构造 data.frame 时放置选项 stringsAsFactors=FALSE... 或者更新到刚刚删除此默认行为的 4.0 版 ;)

然后,您可能会遇到另一个问题,因为您必须对右侧 df$Period No. 进行子集化才能获得与左侧相同数量的 obs。

解析示例,将因子重新解析为字符:

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"]

我们可以使用 case_whenifelse 或简单的索引赋值

i1 <- grepl("^Q\d+", df$Frequency)
df$Period[i1] <- df$`Period No.`[i1]