【问题标题】:substitute the elements of a vector with values from dataframe用数据框中的值替换向量的元素
【发布时间】:2019-09-25 14:20:07
【问题描述】:

我需要替换与 R 中数据框中特定列的元素匹配的向量元素。 可重现的例子:

a<-c("A","B","C","D")
b<-data.frame(col1=c("B","C","E"),col2=c("T","Y","N"))

我需要得到以下向量:

new<-c("A","T","Y","D")

我尝试的是:

new <- a
new <- b$col2[match(a, b$col1)]

进行替换,但将不匹配的元素转换为 NA。 任何帮助表示赞赏

【问题讨论】:

    标签: r dataframe vector


    【解决方案1】:

    您可以从a 创建一个data.table,然后只更新与b 连接时匹配的行。

    library(data.table)
    setDT(b)
    
    data.table(a)[b, on = .(a = col1), a := i.col2][]
    #    a
    # 1: A
    # 2: T
    # 3: Y
    # 4: D
    

    在基础 R 中,您可以使用当前方法,但使用 ifelseNAs 替换为 a 的元素

    temp <- as.character(b$col2[match(a, b$col1)])
    ifelse(is.na(temp), a, temp)
    # [1] "A" "T" "Y" "D"
    

    【讨论】:

    • @Grant 如果适合你,别忘了接受答案
    • @denis,当然,我只是没有足够的声誉来快速接受它:)
    【解决方案2】:

    您可以在基础 R 中使用 replace

    a<-c("A","B","C","D")
    b<-data.frame(col1=c("B","C","E"),col2=c("T","Y","N"), stringsAsFactors = F)
    
    replace(a, which(a %in% b$col1), b$col2[b$col1 %in% a])
    
    #[1] "A" "T" "Y" "D"
    

    【讨论】:

    • 谢谢,我认为这是一个更清洁的解决方案!对不起,我不能以低声誉投票
    • 请记住,如果使用此解决方案,由于没有match,因此col1 的顺序必须与a 的顺序相同。将b 中的第 1 行和第 2 行交换为 b &lt;- b[c(2, 1, 3),],其输出将是 A、Y、T、D,而使用 match 的输出仍然是 A T Y D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2016-07-08
    • 2014-11-20
    • 2018-07-23
    相关资源
    最近更新 更多