【问题标题】:How to map a column through a dictionary in R如何通过R中的字典映射列
【发布时间】:2015-02-26 20:13:31
【问题描述】:

我在 R 中有一个数据框。该数据框的一列取值从 1 到 6。我有另一个映射该列的数据框。有一些方法可以在不使用循环的情况下替换此列中的值(使用某些函数)?

     [,1] [,2]   
[1,] "1"  "A"
[2,] "2"  "B"
[3,] "3"  "C"
[4,] "4"  "D"

[1] 4 2 2 3 4 1 4 4

是否存在不使用循环返回以下向量的函数?

[1] D B B C D A D D

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    你可以试试

    v1 <- c(4, 2, 2, 3, 4, 1, 4, 4)
    LETTERS[v1]
    #[1] "D" "B" "B" "C" "D" "A" "D" "D"
    

    假设如果您的映射数据集第 2 列不只是“字母”

    d1 <- data.frame(Col1=c(1,3,4,2), Col2=c('j1', 'c9', '19f', 'd18'),
                         stringsAsFactors=FALSE)
    
    unname(setNames(d1[,2], d1[,1])[as.character(v1)])
    #[1] "19f" "d18" "d18" "c9"  "19f" "j1"  "19f" "19f"
    

    或者

    d1$Col2[match(v1, d1$Col1)]
    #[1] "19f" "d18" "d18" "c9"  "19f" "j1"  "19f" "19f"
    

    【讨论】:

      【解决方案2】:

      要使用这种类型的地图/字典创建新的数据框列,也可以使用匹配方法:

      snape_gradebook_df<-data_frame(students=c("Harry", "Hermione", "Ron", "Neville", "Ginny", "Luna", "Draco", "Cho"),
                 numeric_grade=c(4,2,2,3,4,1,4,4))
      grade_map<-data_frame(numbers=c(1,2,3,4), letters=c("A", "B", "C", "D"),
                          stringsAsFactors = FALSE)
      snape_gradebook_df['letter_grade']<-grade_map$letters[match(old_list, grade_map$numbers)]
      

      我不确定 setNames 与 match 的优缺点 - 只是想我会分享另一种可能的解决方案。

      【讨论】:

        猜你喜欢
        • 2017-09-29
        • 2023-03-10
        • 1970-01-01
        • 2021-01-26
        • 2019-12-01
        • 2018-09-09
        • 2019-02-23
        • 1970-01-01
        • 2021-01-18
        相关资源
        最近更新 更多