如何在R中重新编码数据帧内的数据

如何在R中重新编码数据帧内的数据,r,R,可以概括为许多列的数据示例如下 id colour zm cinema pen wm monitor mn 1 blue good a wood bad 24 very good 2 Yellow bad b metal good enough 23 good 3 Red good enough d plas

可以概括为许多列的数据示例如下

id  colour  zm          cinema  pen     wm          monitor mn
1   blue    good        a       wood    bad         24      very good
2   Yellow  bad         b       metal   good enough 23      good
3   Red     good enough d       plastic bad         27      good enough
我想要下表

id  colour  zm  cinema  pen     wm  monitor mn
1   blue    B   a       wood    D   34      A
2   Yellow  D   b       metal   C   23      B
3   Red     C   d       plastic D   27      C
非常好=A,好=B,足够好=C,坏=D。
我知道它可以通过变异来实现,但在数据帧内很难实现。

我们可以使用命名向量来更改值

nm1 <- setNames(LETTERS[1:4], c("very good", "good", "good enough", "bad"))
library(dplyr)
df2 <- df1 %>%
     mutate(across(c(zm, wm, mn), ~ nm1[.]))
数据
我们可以使用命名向量来更改值

nm1 <- setNames(LETTERS[1:4], c("very good", "good", "good enough", "bad"))
library(dplyr)
df2 <- df1 %>%
     mutate(across(c(zm, wm, mn), ~ nm1[.]))
数据
另一种方法是使用forcats::fct_重新编码:


另一种方法是使用forcats::fct_重新编码:


或者,您也可以使用重新编码,以确保良好的易读性:

图书馆弹琴 df1% 变异 zm=recodezm,非常好=A,好=B,足够好=C,差=D df1 id彩色zm电影笔wm监视器mn 1蓝色B木头坏24非常好 2 2黄色D b金属足够好23良好 3红色C d塑料坏27足够好 编辑:当然,您需要库,因为mutate和recode是其中的一部分

说明:
mutate可以向数据帧添加或更改列。如您所料,重新编码采用zm并替换值,然后mutate将结果重新分配给zm。

或者,您可以使用重新编码,以确保良好的易读性:

图书馆弹琴 df1% 变异 zm=recodezm,非常好=A,好=B,足够好=C,差=D df1 id彩色zm电影笔wm监视器mn 1蓝色B木头坏24非常好 2 2黄色D b金属足够好23良好 3红色C d塑料坏27足够好 编辑:当然,您需要库,因为mutate和recode是其中的一部分

说明: mutate可以向数据帧添加或更改列。正如您所期望的那样,recode接受zm并替换值,mutate将结果分配回zm。

使用match的base R选项

资料

使用match的base R选项

资料


谢谢,但我得到一个错误:不能拼接闭包类型的对象,因为它不是vector@user330你能展示一下你的软件包版本“dplyr”吗?我用factor类也试过了,它对meIt有效,上面写着“1.0.2”,好吗?@user330我也有同样的版本。错误是基于我帖子中的数据还是不同的数据。如果是不同的,最好显示dput或str以了解结构我认为您可以,但当我使用您的代码时,我得到错误:无法拼接闭包类型的对象,因为它不是矢量汉克斯,但我得到一个错误:不能拼接闭包类型的对象,因为它不是vector@user330你能展示一下你的软件包版本“dplyr”吗?我用factor类也试过了,它对meIt有效,上面写着“1.0.2”,好吗?@user330我也有同样的版本。错误是基于我帖子中的数据还是不同的数据。如果是不同的,最好显示dput或str来理解结构。我认为您可以,但当我使用您的代码时,我得到错误:无法拼接闭包类型的对象,因为它不是向量
df1 <- structure(list(id = 1:3, colour = c("blue", "Yellow", "Red"), 
    zm = c("good", "bad", "good enough"), cinema = c("a", "b", 
    "d"), pen = c("wood", "metal", "plastic"), wm = c("bad", 
    "good enough", "bad"), monitor = c(24L, 23L, 27L), mn = c("very good", 
    "good", "good enough")), class = "data.frame", row.names = c(NA, 
-3L))
vars <- c(A = "very good", B = "good", C = "good enough", D = "bad")

library(dplyr)
library(forcats)
data %>% 
  mutate(across(where(is.character),~fct_recode(.,!!!vars)))
  id colour zm cinema     pen wm monitor mn
1  1   blue  B      a    wood  D      24  A
2  2 Yellow  D      b   metal  C      23  B
3  3    Red  C      d plastic  D      27  C
v <- c("very good", "good", "good enough", "bad")
cols <- c("zm", "wm", "mn")
df[cols] <- LETTERS[seq_along(v)][match(unlist(df[cols]), v)]
> df
  id colour zm cinema     pen wm monitor mn
1  1   blue  B      a    wood  D      24  A
2  2 Yellow  D      b   metal  C      23  B
3  3    Red  C      d plastic  D      27  C
> dput(df)
structure(list(id = 1:3, colour = c("blue", "Yellow", "Red"),
    zm = c("good", "bad", "good enough"), cinema = c("a", "b",
    "d"), pen = c("wood", "metal", "plastic"), wm = c("bad",
    "good enough", "bad"), monitor = c(24L, 23L, 27L), mn = c("very good",
    "good", "good enough")), class = "data.frame", row.names = c(NA,
-3L))