根据其他变量R的值创建新变量的宏

7kqas0il  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(120)

我尝试创建一个变量“Q7_1_r”,其值基于现有变量“Q7_1”的值,然后将该技术应用于多个变量(类似于宏)
在下面的示例中,我的数据框被称为newfile。如果我硬编码

sevenvar <- function(var){
    newfile <- mutate(newfile, Q7_1_r = case_when(var == 1 ~ 0,
                                    var == 2 ~ 25,
                                    var == 3 ~ 50,
                                    var == 4 ~ 75,
                                    var == 5 ~ 100))
    }

    sevens <- sevenvar(newfile$Q7_1)

这意味着当Q7_1为1时,Q7_1_r为0,当Q7_1 = 2时,Q7_1_r为25,等等。

`head(sevens)`

对结果很满意
问题是,我有超过100个变量来运行这个代码块,而不是写100次,我想创建一个动态的,它根据“var”的值创建“var_r”,然后在此之外做一行,说“var”是“Q7_1”,“Q23_4”,“Q35_2”等。(有点像调用宏)
我尝试了以下方法

sevenvar <- function(var){
    newfile <- mutate(newfile, paste(var,"_r", sep = "") = case_when(var == 1 ~ 0,
                                    var == 2 ~ 25,
                                    var == 3 ~ 50,
                                    var == 4 ~ 75,
                                    var == 5 ~ 100))
    }

    sevens <- sevenvar(newfile$Q7_1)
    head(sevens)

但失败了这个问题似乎与创建“var_r”变量的代码有关。任何人都可以请建议如何做到这一点,而不是我硬编码上述100倍?谢谢

9udxz4iz

9udxz4iz1#

您可以在所需的列上使用matchlapply编写一个小函数。

fun <- \(x, a, b) b[match(x, a)]

考虑这个玩具数据框。

df
#   X1 X2 X3 X4         X5
# 1  1  1  2  4  2.0184237
# 2  5  2  2  1 -0.0627141
# 3  1  4  1  5  1.3048697

v <- c("X1", "X3", "X4")
df[v] <- lapply(df[v] , fun, a=1:5, b=c(0, 25, 50, 75, 100))
df
#    X1 X2 X3  X4         X5
# 1   0  1 25  75  2.0184237
# 2 100  2 25   0 -0.0627141
# 3   0  4  0 100  1.3048697
  • 数据:*
set.seed(42)
df <- cbind(data.frame(matrix(sample(1:5, 12, replace=TRUE), 3, 4)), X5=rnorm(3))

相关问题