【问题标题】:replace a numerical column by a character column in R with a defined mapping用定义的映射在 R 中用字符列替换数字列
【发布时间】:2015-02-01 07:49:45
【问题描述】:

我进行了一些搜索,但找不到问题的答案。

假设我有一个数据框,其中包含整数列 student_id 和其他一些列。我还有另一个包含两列的映射表,第一列是student_id,第二列是字符串中的student_name。用student_name 替换student_id 列的最佳方法是什么?注意映射表是唯一的,但是数据框可以有多个相同的学生id。

如果有帮助,我正在使用 dplyrtidyr 包。

【问题讨论】:

    标签: r mapping dplyr tidyr


    【解决方案1】:

    假设 grades 是您的 data.frame,其中包含过去 10 年学校提供的每个班级授予的每个年级的记录,其中包含字段(年级、学生 ID、班级编号),roster 是一个列表每个学生有一份记录,其中包含在同一时间段内就读该学校的所有学生的姓名和身份证。

    名册每个学生有一个记录,成绩有每个学生多个记录。

    您可以通过调用 dplyr 从名册中推送学生姓名

    library(dplyr)
    gradesWithStudentNames <- 
            grades %>% 
            left_join(select(roster,studentID,studentName),
                      by=`studentID')
    

    即使roster 中没有匹配的学生,左连接也将包括表grades 的每一行(在这种情况下,学生姓名将丢失)。使用inner_join 将省略此类记录,outer_join 将包含roster 中未参加任何课程的学生的记录(缺少班级编号和年级的值)。

    我建议阅读标题为“双表动词”的小插图,它描述了各种连接,可以使用 browseVignettes('dplyr') 找到

    【讨论】:

    • 感谢您的回答。它确实部分解决了我的问题,因为我可以将studentName 列添加到我的数据框中。但是,我仍然想用studentName 列“替换”studentID 列,并且还想保留列的位置。我能够通过以下方式实现这一点:grades &lt;- grades[, c(c('grade', 'studentName'), setdiff(names(grades), c('grade', 'studentID', 'studentName')))] 我拥有的数据框的列比此示例多得多。所以这就是我使用 setdiff 函数的原因。
    猜你喜欢
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2014-02-06
    • 2012-05-29
    • 2020-09-08
    • 2021-04-21
    相关资源
    最近更新 更多