Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在具有不同函数的多组列上进行变异_R_Dplyr_Mutate - Fatal编程技术网

R 在具有不同函数的多组列上进行变异

R 在具有不同函数的多组列上进行变异,r,dplyr,mutate,R,Dplyr,Mutate,我定义了必须应用于不同数据帧列集的函数。例如,mtcars我想将as.integer()函数应用于列c(“mpg”、“cyl”)和as.logical()应用于c(“vs”、“am”) 使用tidyverse时,最好使用相应的函数保存此列集,并在不多次使用mutate\u的情况下应用它们 这就是我的方法。结果是一个矩阵列表,可用于进一步覆盖现有列或创建新列,或用作独立数据对象 vars <- list(van = c("mpg", "cyl"), tu = c("

我定义了必须应用于不同数据帧列集的函数。例如,
mtcars
我想将
as.integer()
函数应用于列
c(“mpg”、“cyl”)
as.logical()
应用于
c(“vs”、“am”)


使用tidyverse时,最好使用相应的函数保存此列集,并在不多次使用
mutate\u的情况下应用它们

这就是我的方法。结果是一个矩阵列表,可用于进一步覆盖现有列或创建新列,或用作独立数据对象

vars <- list(van = c("mpg", "cyl"),
             tu = c("vs", "am"))
funk <- list(van = as.integer,
             tu = as.logical)

mapply(FUN = function(v, f) {
  sapply(mtcars[, v], FUN = f)
}, v = vars, f = funk, SIMPLIFY = FALSE)

$van
      mpg cyl
 [1,]  21   6
 [2,]  21   6
 [3,]  22   4
 [4,]  21   6
 [5,]  18   8
 ...
$tu
         vs    am
 [1,] FALSE  TRUE
 [2,] FALSE  TRUE
 [3,]  TRUE  TRUE
 [4,]  TRUE FALSE
 [5,] FALSE FALSE
 ...

vars我正要提出@Roman Lustrik在其答案的最后一部分中使用的相同方法,但这是在我打字之间完成的:)。当我在这里的时候,我想我可以给R的switch()函数一些爱,它也可以做这项工作

for (i in colnames(mtcars)) {
    mtcars[, i] = switch(i,
                         mpg = as.integer(mtcars[, i]),
                         cyl = as.integer(mtcars[, i]),
                         vs = as.logical(mtcars[, i]),
                         am = as.logical(mtcars[, i]))
}

> head(mtcars)
                  mpg cyl    vs    am
Mazda RX4          21   6 FALSE  TRUE
Mazda RX4 Wag      21   6 FALSE  TRUE
Datsun 710         22   4  TRUE  TRUE
Hornet 4 Drive     21   6  TRUE FALSE
Hornet Sportabout  18   8 FALSE FALSE
Valiant            18   6  TRUE FALSE
编辑:

由于switch()函数的副作用是,如果没有给定默认值,则会删除列,而OP会要求保留所有列。。。以下是解决方案:

for (i in colnames(mtcars)) {
    mtcars[, i] = switch(i,
                         mpg = as.integer(mtcars[, i]),
                         cyl = as.integer(mtcars[, i]),
                         vs = as.logical(mtcars[, i]),
                         am = as.logical(mtcars[, i]),
                         mtcars[, i]) # just add a default option
}

> head(mtcars)
                  mpg cyl disp  hp drat    wt  qsec    vs    am gear carb
Mazda RX4          21   6  160 110 3.90 2.620 16.46 FALSE  TRUE    4    4
Mazda RX4 Wag      21   6  160 110 3.90 2.875 17.02 FALSE  TRUE    4    4
Datsun 710         22   4  108  93 3.85 2.320 18.61  TRUE  TRUE    4    1
Hornet 4 Drive     21   6  258 110 3.08 3.215 19.44  TRUE FALSE    3    1
Hornet Sportabout  18   8  360 175 3.15 3.440 17.02 FALSE FALSE    3    2
Valiant            18   6  225 105 2.76 3.460 20.22  TRUE FALSE    3    1

不太确定您想要的方法是什么样子的。是否要创建包含变量和相应函数的列表?我不确定您想要什么。您是否只是想通过这些更改(即不必应用
mutate_at
函数)来保存
mtcars
数据集,以便继续使用例如“mpg”和“cyl”以及“vs”和“am”作为整数值和逻辑值,分别?@TimTeaFan它可以是一个包含变量和相应函数的列表,也可以是其他内容(列表看起来最适合我)。主要的一点是,在最后,我不需要在
@larsoevlisen处编写多个
mutate\u,我想要与上面代码中相同的输出,但不需要在
处多次使用
mutate\u,我必须在我的实际代码中编写近20个这样的语句(这只是一个示例)。我希望我是清楚的,否则让我知道。你能添加你将如何覆盖现有的列吗?谢谢你。@Miha完成了。还添加了另一个跳过
mapply
部分的解决方案。
for (i in seq_along(vars)) {
  cls <- vars[[i]]
  f <- funk[[i]]

  mtcars[, cls] <- sapply(mtcars[, cls], FUN = f)
}

> head(mtcars)
                  mpg cyl disp  hp drat    wt  qsec    vs    am gear carb
Mazda RX4          21   6  160 110 3.90 2.620 16.46 FALSE  TRUE    4    4
Mazda RX4 Wag      21   6  160 110 3.90 2.875 17.02 FALSE  TRUE    4    4
Datsun 710         22   4  108  93 3.85 2.320 18.61  TRUE  TRUE    4    1
Hornet 4 Drive     21   6  258 110 3.08 3.215 19.44  TRUE FALSE    3    1
Hornet Sportabout  18   8  360 175 3.15 3.440 17.02 FALSE FALSE    3    2
Valiant            18   6  225 105 2.76 3.460 20.22  TRUE FALSE    3    1
for (i in colnames(mtcars)) {
    mtcars[, i] = switch(i,
                         mpg = as.integer(mtcars[, i]),
                         cyl = as.integer(mtcars[, i]),
                         vs = as.logical(mtcars[, i]),
                         am = as.logical(mtcars[, i]))
}

> head(mtcars)
                  mpg cyl    vs    am
Mazda RX4          21   6 FALSE  TRUE
Mazda RX4 Wag      21   6 FALSE  TRUE
Datsun 710         22   4  TRUE  TRUE
Hornet 4 Drive     21   6  TRUE FALSE
Hornet Sportabout  18   8 FALSE FALSE
Valiant            18   6  TRUE FALSE
for (i in colnames(mtcars)) {
    mtcars[, i] = switch(i,
                         mpg = as.integer(mtcars[, i]),
                         cyl = as.integer(mtcars[, i]),
                         vs = as.logical(mtcars[, i]),
                         am = as.logical(mtcars[, i]),
                         mtcars[, i]) # just add a default option
}

> head(mtcars)
                  mpg cyl disp  hp drat    wt  qsec    vs    am gear carb
Mazda RX4          21   6  160 110 3.90 2.620 16.46 FALSE  TRUE    4    4
Mazda RX4 Wag      21   6  160 110 3.90 2.875 17.02 FALSE  TRUE    4    4
Datsun 710         22   4  108  93 3.85 2.320 18.61  TRUE  TRUE    4    1
Hornet 4 Drive     21   6  258 110 3.08 3.215 19.44  TRUE FALSE    3    1
Hornet Sportabout  18   8  360 175 3.15 3.440 17.02 FALSE FALSE    3    2
Valiant            18   6  225 105 2.76 3.460 20.22  TRUE FALSE    3    1