同时使用 startsWith 和 paste0

问题描述 投票:0回答:1

我有一个类似于下面的数据框架。

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)

谁能帮我解决这个问题?

r paste startswith
1个回答
0
投票

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

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

0
投票

似乎你的数据帧字符被解析为因子,这意味着它们是隐藏的整数,为了避免这种情况,你可以在读取或构造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"]
© www.soinside.com 2019 - 2024. All rights reserved.