我有一个类似于下面的数据框架。
Frequency Period No. Period
Q1 3
Q2 6
Q3 9
如果Frequency列中的值以 "Q "开头,我想让Period列填入相应的Quarter(即如果Frequency是Q1,Period就是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)
谁能帮我解决这个问题?
我们可以使用 case_when
或 ifelse
或简单的赋值与索引
i1 <- grepl("^Q\\d+", df$Frequency)
df$Period[i1] <- df$`Period No.`[i1]
似乎你的数据帧字符被解析为因子,这意味着它们是隐藏的整数,为了避免这种情况,你可以在读取或构造data.frame时,将选项stringsAsFactors=FALSE。
为了避免这种情况,你可以在读取或构建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"]