gpt4 book ai didi

将多列中的不同值重新编码为因子

转载 作者:行者123 更新时间:2023-12-03 15:34:11 29 4
gpt4 key购买 nike

假设我有一个看起来像这样的数据集:

df <- data.frame("age" = c(55, 21, 11), 
"sex" = c("m", "m", "f"),
"a2" = c(0,1,0),
"a3" = c(0,0,0),
"a4" = c(0,1,0),
"b2" = c(0,0,1),
"b3" = c(0,0,0),
"b4" = c(1,0,1),
"c2" = c(0,1,0)
)
age sex a2 a3 a4 b2 b3 b4 c2
55 m 0 0 0 0 0 1 0
21 m 1 0 1 0 0 0 1
11 f 0 0 0 1 0 1 0
我如何才能将其转换为长格式并更改 a1-c1 列的值,以便每一列都具有其名称的值? e. G。在 a2 0=1 和 1=2?
我用pivot_longer这样试过:
df %>% pivot_longer(
cols = stars_with("a"),
names_to = "A"
)
我想要的输出如下所示:
age sex a2 a3 a4 b2 b3 b4 c2
55 m 1 1 1 1 1 4 1
21 m 2 1 4 1 3 1 2
11 f 1 1 1 2 1 4 1
谢谢!

最佳答案

这是一个很好的问题,因为您无法访问 mutate_at 中的列名。 ,这是您通常在变量列表中变异的方式。这是使用 map_dfc 的解决方案来自 purrr :

library(purrr)
library(dplyr)
library(tidyr)
library(readr)
我们定义了一个函数(虽然不是必需的,但如果您不习惯 purrr ,则有助于避免使用外来语法。
my_fun <- function(x) transmute(df, !!x := ifelse(!!sym(x) == 0, 1, parse_number(x)))
transmute避免重复列 !!x :=是一种根据变量中的字符串分配列名的方法。在我们的例子中,是一个列名。 !!sym()将我们的变量名从字符串转换为符号。如果没有这个,对于“a2”列,这将显示为 "a2" == 0因此替换为列号。 Refer to this answer for an in-depth explanation. parse_number将在列名中找到数字 ifelse声明如果列值等于 0,则该值等于 1,否则该值等于列名中的数字
var_names <- c("a2","a3","a4","b2","b3","b4","c2")

map_dfc(var_names, my_fun)

关于将多列中的不同值重新编码为因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66727301/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com