【问题标题】:how to recode (and reverse code) variables in columns with dplyr如何使用 dplyr 重新编码(和反向编码)列中的变量
【发布时间】:2017-07-06 22:08:11
【问题描述】:

在 2013 年最后一次使用 R 之后,我再次开始使用它。我已经习惯使用 dplyr,但我遇到了一个简单任务的问题。 我有一张看起来像的桌子

Participant Q1       Q2      Q3     Q4       Q5
1           agree  neutral   NA    Disagree  Agree
2           neutral agree    NA     NA       NA

我的目标

   Participant Q1       Q2      Q3     Q4       Q5
    1           3       2       NA      1       3
    2           2       1       NA     NA       NA

我希望能够将 Q1:Q5 列的分类值更改为数值,但是我看到的所有使用 dplyr 重新编码的示例都适用于行而不是列。 (我可能在示例中遗漏了一些东西)。然后我希望能够选择列 Q1 和 Q2 并对其进行反向编码。

如果可能,我正在尝试在 dplyr 中学习这样做

谢谢

【问题讨论】:

  • 数据框是为列操作而构建的。我会说你应该reshape2::melttidyr::gather 将你的数据转换成一个长格式,然后像往常一样继续处理,使用公共变量。
  • 感谢您的回复。我不确定你所说的可变罪公地是什么意思。我按照你的建议做了'收集(表格,“问题”,“答案”,2:6)',现在我可以使用重新编码来替换我的值答案列,但随后它们被放置在值中而不是在表
  • 我的意思是 columns,而不是 commons。
  • 同意您的数据不整洁,因此在您使用 tidyr::gather 之前不建议使用 dplyr。我来到这个页面是因为我正在查找新的 dplyr::recode() 函数,一旦你将数据整理成整洁的格式,这可能会有所帮助。

标签: r dplyr


【解决方案1】:

感谢 dplyr 的 recode 函数,这现在相当简单。这是一种方法:

# Generate a dataframe to match yours

df <- data.frame(
  participant = c(1,2),
  Q1 = c("agree", "neutral"),
  Q2 = c("neutral", "agree"),
  Q3 = c(NA,NA),
  Q4 = c("Disagree", NA),
  Q5 = c("Agree", NA)
)

# Use recode to recode the data

df_recode <- df %>%
  mutate(Q1 = recode(Q1, "agree" = 3, "neutral" = 2),
         Q2 = recode(Q2, "neutral" = 2, "agree" = 1),
         Q4 = recode(Q4, "Disagree" = 1),
         Q5 = recode(Q5, "Agree" = 3)
  )

您还需要阅读帮助文件中的 .default.missing 参数,以确保您没有在无意中引入 NAs

【讨论】:

    【解决方案2】:

    我们可以在base R 中做到这一点,而无需使用任何包。创建一个名为向量 ('v1') 的查找,遍历列并使用该向量来更改列中的值

    v1 <- setNames(c(1:3, 3), c("Disagree", "neutral", "agree", "Agree"))
    df1[-1] <- lapply(df1[-1], function(x) if(any(!is.na(x))) v1[x] else NA)
    df1 
    #  Participant Q1 Q2 Q3 Q4 Q5
    #1           1  3  2 NA  1  3
    #2           2  2  3 NA NA NA
    

    数据

    df1 <- structure(list(Participant = 1:2, Q1 = c("agree", "neutral"), 
    Q2 = c("neutral", "agree"), Q3 = c(NA, NA), Q4 = c("Disagree", 
    NA), Q5 = c("Agree", NA)), .Names = c("Participant", "Q1", 
    "Q2", "Q3", "Q4", "Q5"), class = "data.frame", row.names = c(NA, -2L))
    

    【讨论】:

    • 这样好多了。仍在弄清楚所有部分是如何工作的,但这也需要处理反向代码部分。非常感谢
    • oops- 同意这不应该根据 StackOverflow 指南被否决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    相关资源
    最近更新 更多