如何收集特定列

How to gather specific columns

我正在以 tidyverse 的方式处理我的数据集。但是,最后的 recode 功能不起作用。这是一个例子:

olddata <- data.frame(
       x = rep(1,12),
       var_a = sample(1:10, 12, replace = TRUE),
       var_b = sample(1:10, 12, replace = TRUE),
       var_c = sample(1:10, 12, replace = TRUE))

newdata <- olddata %>%
  gather(var, type, var_a:var_c) %>%
  separate(var, into = c("var", "role"), sep = -1) %>%
  recode(role, "a"=1, "b"=2, "c"=3)

错误消息说

Error in UseMethod("recode") : no applicable method for 'recode' applied to an object of class "data.frame"

这里有什么问题?

recode 是一个 returns 向量的函数。如果您的目标是 tidyverse 工作流程,您可以使用 mutate 函数来获得所需的结果

newdata <- olddata %>%
  gather(var, type, var_a:var_c) %>%
  separate(var, into = c("var", "role"), sep = -1) %>%
  mutate( role = recode(role, "a"=1, "b"=2, "c"=3))

head(newdata)
  x  var role type
1 1 var_    1    3
2 1 var_    1    5
3 1 var_    1    2
4 1 var_    1    4
5 1 var_    1   10
6 1 var_    1    7

gather 已退休。如果您使用 pivot_longer 函数,它可以在此处将 gatherseparate 步骤组合在一起。

library(dplyr)
library(tidyr)

olddata %>%
  pivot_longer(cols = -x, 
               names_to = c('var', 'role'), 
               names_pattern = '(var_)(.*)') %>%
  mutate(role = recode(role, "a"=1, "b"=2, "c"=3))

#       x var    role value
#   <dbl> <chr> <dbl> <int>
# 1     1 var_      1     6
# 2     1 var_      2     1
# 3     1 var_      3     9
# 4     1 var_      1     4
# 5     1 var_      2     6
# 6     1 var_      3     7
# 7     1 var_      1     5
# 8     1 var_      2     8
# 9     1 var_      3     8
#10     1 var_      1     7
# … with 26 more rows