【问题标题】:Move "*" to new column in R将“*”移动到 R 中的新列
【发布时间】:2019-01-21 11:02:41
【问题描述】:

您好,我在 data.frame 中有一个列,它有很多行,例如,

df = data.frame("Species" = c("*Briza minor", "*Briza minor", "Wattle"))

我想创建一个新列“Species_new”,其中“*”移动到字符串的末尾,例如,

df = data.frame("Species" = c("*Briza minor", "*Briza minor", "Wattle"),
            "Species_new" = c("Briza minor*", "Briza minor*", "Wattle"))

有没有办法使用 gsub 来做到这一点?由于我有大约 50,000 行,手动示例将花费太长时间。

提前致谢

【问题讨论】:

  • 你需要sub("^([*])(.*)", "\\2\\1", df$Species)

标签: r character gsub stringr


【解决方案1】:

一种选择是将* 捕获为一个组,并在replacement 中反向引用

df$Species_new <- sub("^([*])(.*)$", "\\2\\1", df$Species)
df$Species_new
#[1] "Briza minor*" "Briza minor*" "Wattle"    

注意:* 是一个元字符,意思是 0 或更多,因此我们可以转义 (\\*) 或将其放在括号中 ([]) 以评估原始字符,即文字评估

【讨论】:

    【解决方案2】:

    非常感谢您的快速回复,我也找到了解决方法;

    df$Species_new = sub("[*]","",df$Species, perl=TRUE)
    
    differences = setdiff(df$Species,df$Species_new)
    
    tochange = subset(df,df$Species == differences)
    toleave = subset(df,!df$Species == differences)
    
    tochange$Species_new = paste(tochange$Species_new, "*", sep = "")
    
    df = rbind(tochange,toleave)
    

    【讨论】:

    • 确保Species 中没有NAs,否则您将丢失行。您可以使用paste0 代替pastesep=""(同样的事情,只是更具可读性)。但我认为您应该采用@akrun 的解决方案,因为它更健壮、更紧凑。
    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 2021-09-15
    • 2017-12-04
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多