【问题标题】:Replacing column headers with matched variables from another dataframe用另一个数据框中的匹配变量替换列标题
【发布时间】:2021-02-14 22:36:41
【问题描述】:

我有一个包含大约 50 个条目和 2 列的数据框 - 短问题名称和相应长问题名称的长列表:

variable_short variable_long
cat Do you have a cat?
col Is blue your favourite colour?
stress Are you stressed at work?

这是调查中使用的问题的摘要。调查回复位于一个单独的数据框中,其中包含列名,这些列名是 variable_short 中的变量 -

person.id cat col stress
2567 1 0 1

我正在尝试创建一个新数据框,其中仅包含 50 个我需要的 10 个问题以及相应的调查回复以及人员 ID。我正在努力用变量数据框中的相应长问题格式替换调查数据中的短问题格式。理想情况下是这样的:

person.id Do you have a cat? Are you stressed at work?
2567 1 1

我开始对变量进行子集化以得到我需要的变量:

new <- subset(variables, variable_short %in% c('cat', 'stress'), select = c('variable_short', 'variable_long'))

它对变量重新排序,所以我不能按顺序进行,我认为这不是最有效的方法,以防变量顺序发生变化。我可以重命名列标题,但我还不熟悉匹配特别是匹配对应的变量到标题。

我现在完全陷入困境,因此我们将不胜感激。非常感谢。

【问题讨论】:

  • 我建议使用tidyr::pivot_longer 将您的调查数据转换为长而“整洁”的格式,然后使用调查短名称作为键对您的查找表进行left_join,然后再次扩大范围。
  • 您是要为每个 person.id 创建一个单独的表,其中只包含与其相关的标题,还是要创建一个包含所有 person.id 但许多 NA' 列的大表,这些列与不相关的问题询问那个特定的 person.id?
  • @Jon Spring 谢谢你的建议,我会试试的。我实际上是在尝试创建第三个表,它只是更改第二个表以保留所有数据,但将除“person.id”之外的标题替换为第一个表中 variable.long 中的选定变量。

标签: r dataframe dplyr header tidyverse


【解决方案1】:

我们可以使用match 重命名列名:

names(df2)[-1] <- df1$variable_long[match(names(df2[-1]), df1$variable_short)]
df2

#  person.id Do you have a cat? Is blue your favourite colour? Are you stressed at work?
#1      2567                  1                              0                    1

如果您只想保留其中包含 1 的值,请以长格式和 filter 重塑数据。

library(dplyr)
library(tidyr)

df2 %>%
  pivot_longer(cols = -person.id) %>%
  filter(value == 1)

#  person.id name                      value
#      <int> <chr>                     <int>
#1      2567 Do you have a cat?            1
#2      2567 Are you stressed at work?     1

【讨论】:

  • “匹配”功能完美运行,我认为这正是我们所需要的。我还将查看“pivot_longer”,这可能是一种更好的数据结构方式。非常感谢您的帮助!
【解决方案2】:

您的问题可能是 R 不允许稍后在代码中引用带有空格的列标题,因此使用长问题作为列标题不会是一个成功的策略。为了在我自己的编码中避免这种情况,我将每个空格替换为下划线以便于阅读,但我看到其他人使用 camelCase 或 PascalCase 命名样式。由于您只有十个问题/列标题,因此硬编码新列名称而不是自动重命名可能是一种不错的情况,如this Stack Overflow question thread 中所述。

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 1970-01-01
    • 2022-01-17
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多