【问题标题】:Partial match to replace variable name部分匹配替换变量名
【发布时间】:2020-09-14 19:45:22
【问题描述】:

假设我有以下数据框。如何使用 df2 的“Partial_Match”将 df1 的“CS”替换为 df2 的“名称”?我正在寻找的是一个看起来像 df3 的输出。谢谢。

old <- c("CS1.1.length", "CS1.7.length", "CS1.10.length", "CS1.12.length", "CS2.4.length", "CS2.6.length", "CS2.9.length", "CS2.11.length")
new <- c("Bob", "Alex", "Gary", "Taylor", "Tom", "John", "Pat", "Mary")
partial_match <- c("CS1.1", "CS1.7", "CS1.10", "CS1.12", "CS2.4", "CS2.6", "CS2.9", "CS2.ll")
df1 <- data.frame(CS = old, Num = sample(50,8))
df2 <- data.frame(Partial_Match = partial_match, Name = new)
df3 <- data.frame(df2[2],df1[2])

【问题讨论】:

    标签: r string join


    【解决方案1】:

    如果old 是完整数据集的良好表示,则可以删除字符串的.length 部分,然后执行连接。

    Mary 没有加入这里,因为partial_match[8]CS2.ll 而不是CS2.11

    编辑:此解决方案需要tidyverse

    library(tidyverse)
    
    df1 %>%
      mutate(Partial_Match = tools::file_path_sans_ext(CS)) %>%
      left_join(df2) %>%
      select(Name, Num)
    

    编辑 2:同样的东西,但带有基础 R

    df1$Partial_Match <- tools::file_path_sans_ext(df1$CS)
    df3 <- merge(df1, df2)
    df3 <- df3[,c('Name', 'Num')]
    

    【讨论】:

    • 对不起,我应该先说“旧”是数据的一小部分。我的整个数据框将包含远远超过 .length(即 CS1.1.width、CS1.1.height 等),但 CS#.#.将始终保持不变。我正在寻找一种可以替代 CS#.# 的解决方案。带有“新”标签。
    • 如果它是相同的模式,而不是匹配.length,您可以假装最后一个句点之后的所有内容都是“文件扩展名”并使用此基本 R 函数 tools::file_path_sans_ext(old) 将其删除。
    • 为了完整起见,here 是使用正则表达式在最后一个句点之后删除所有内容的另一种方法。例如。 mutate(Partial_Match = str_remove(CS, "\\.[^.]*$"))gsub("\\.[^.]*$","", df1$CS).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2012-08-15
    相关资源
    最近更新 更多