如何在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))