【问题标题】:Using startsWith and paste0 together一起使用startsWith和paste0
【发布时间】:2020-05-07 18:15:08
【问题描述】:

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

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)

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

【问题讨论】:

  • df$Frequency 很可能是一个因素。检查类(df$Frequency)。然后做 df$Frequency = as.character(df$Frequency) ;然后做替换

标签: r paste startswith


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    为避免这种情况,您可以在读取或构造 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"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2023-01-31
      • 2022-11-21
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      相关资源
      最近更新 更多