gpt4 book ai didi

r - 是否有像 switch 这样的函数在 dplyr::mutate 中工作?

转载 作者:行者123 更新时间:2023-12-03 12:31:51 28 4
gpt4 key购买 nike

我不能在 mutate 内部使用 switch因为它返回整个向量而不仅仅是行。作为一个黑客,我正在使用:

pick <- function(x, v1, v2, v3, v4) {
ifelse(x == 1, v1,
ifelse(x == 2, v2,
ifelse(x == 3, v3,
ifelse(x == 4, v4, NA))))
}

这适用于 mutate ,并且现在很好,因为我通常会在 4 件事中进行选择,但这可能会改变。你能推荐一个替代方案吗?

例如:
library(dplyr)
df.faithful <- tbl_df(faithful)
df.faithful$x <- sample(1:4, 272, rep=TRUE)
df.faithful$y1 <- rnorm(n=272, mean=7, sd=2)
df.faithful$y2 <- rnorm(n=272, mean=5, sd=2)
df.faithful$y3 <- rnorm(n=272, mean=7, sd=1)
df.faithful$y4 <- rnorm(n=272, mean=5, sd=1)

使用 pick :
mutate(df.faithful, y = pick(x, y1, y2, y3, y4))
Source: local data frame [272 x 8]

eruptions waiting x y1 y2 y3 y4 y
1 3.600 79 1 8.439092 5.7753006 8.319372 5.078558 8.439092
2 1.800 54 2 13.515956 6.1971512 6.343157 4.962349 6.197151
3 3.333 74 4 7.693941 6.8973365 5.406684 5.425404 5.425404
4 2.283 62 4 12.595852 6.9953995 7.864423 3.730967 3.730967
5 4.533 85 3 11.952922 5.1512987 9.177687 5.511899 9.177687
6 2.883 55 3 7.881350 1.0289711 6.304004 3.554056 6.304004
7 4.700 88 4 8.636709 6.3046198 6.788619 5.748269 5.748269
8 3.600 85 1 8.027371 6.3535056 7.152698 7.034976 8.027371
9 1.950 51 1 5.863370 0.1707758 5.750440 5.058107 5.863370
10 4.350 85 1 7.761653 6.2176610 8.348378 1.861112 7.761653
.. ... ... . ... ... ... ... ...

我们看到如果 x == 1,我将值从 y1 复制到 y,依此类推。这就是我想要做的,但希望能够做到这一点,无论我有 4 列还是 400 列的列表。

正在尝试使用 switch :
mutate(df.faithful, y = switch(x, y1, y2, y3, 4))

Error in switch(c(1L, 2L, 4L, 4L, 3L, 3L, 4L, 1L, 1L, 1L, 4L, 3L, 1L, :
EXPR must be a length 1 vector

正在尝试使用 list :
mutate(df.faithful, y = list(y1, y2, y3, y4)[[x]])
Error in list(c(8.43909205142925, 13.5159559591257, 7.69394050059568, :
recursive indexing failed at level 2

正在尝试使用 c :
mutate(df.faithful, y = c(y1, y2, y3, y4)[x])
Source: local data frame [272 x 8]

eruptions waiting x y1 y2 y3 y4 y
1 3.600 79 1 8.439092 5.7753006 8.319372 5.078558 8.439092
2 1.800 54 2 13.515956 6.1971512 6.343157 4.962349 13.515956
3 3.333 74 4 7.693941 6.8973365 5.406684 5.425404 12.595852
4 2.283 62 4 12.595852 6.9953995 7.864423 3.730967 12.595852
5 4.533 85 3 11.952922 5.1512987 9.177687 5.511899 7.693941
6 2.883 55 3 7.881350 1.0289711 6.304004 3.554056 7.693941
7 4.700 88 4 8.636709 6.3046198 6.788619 5.748269 12.595852
8 3.600 85 1 8.027371 6.3535056 7.152698 7.034976 8.439092
9 1.950 51 1 5.863370 0.1707758 5.750440 5.058107 8.439092
10 4.350 85 1 7.761653 6.2176610 8.348378 1.861112 8.439092
.. ... ... . ... ... ... ... ...

不会产生任何错误,但行为不符合预期。

最佳答案

对于 OP 来说太晚了,但如果这出现在搜索中......

dplyr v0.5 有 recode()switch() 的矢量化版本, 所以

data_frame(
x = sample(1:4, 10, replace=TRUE),
y1 = rnorm(n=10, mean=7, sd=2),
y2 = rnorm(n=10, mean=5, sd=2),
y3 = rnorm(n=10, mean=7, sd=1),
y4 = rnorm(n=10, mean=5, sd=1)
) %>%
mutate(y = recode(x,y1,y2,y3,y4))

产生,如预期的那样:
# A tibble: 10 x 6
x y1 y2 y3 y4 y
<int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2 6.950106 6.986780 7.826778 6.317968 6.986780
2 1 5.776381 7.706869 7.982543 5.048649 5.776381
3 2 7.315477 2.213855 6.079149 6.070598 2.213855
4 3 7.461220 5.100436 7.085912 4.440829 7.085912
5 3 5.780493 4.562824 8.311047 5.612913 8.311047
6 3 5.373197 7.657016 7.049352 4.470906 7.049352
7 2 6.604175 9.905151 8.359549 6.430572 9.905151
8 3 11.363914 4.721148 7.670825 5.317243 7.670825
9 3 10.123626 7.140874 6.718351 5.508875 6.718351
10 4 5.407502 4.650987 5.845482 4.797659 4.797659

(也适用于命名参数,包括字符和因子 x。)

关于r - 是否有像 switch 这样的函数在 dplyr::mutate 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28593265/

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