我有以下实现
library(dplyr)
library(tidyr)
dat = data.frame('A' = 1:3, 'C_1' = 1:3, 'C_2' = 1:3, 'M' = 1:3)
以下代码有效
dat %>% rowwise %>% mutate(Anew = list({function(x) c(x[1]^2, x[2] + 5, x[3] + 1)}(c(M, C_1, C_2)))) %>% ungroup %>% unnest_wider(Anew, names_sep = "")
然而,当我尝试使用dplyr::starts_with()
查找列名时,下面的内容不起作用。
dat %>% rowwise %>% mutate(Anew = list({function(x) c(x[1]^2, x[2] + 5, x[3] + 1)}(c(M, starts_with('C_'))))) %>% ungroup %>% unnest_wider(Anew, names_sep = "")
任何有关如何在这种情况下正确应用
starts_with()
的指针都将非常有帮助。PS:这是我早期帖子Apply custom function that returns multiple values after dplyr::rowwise()的延续。
C_
列的数量不等于2时会发生什么?这似乎类似于我展示的情况,即nm1 <- c(C_1 = 5, C_2 = 1); dat %>% mutate(across(starts_with("C_"), ~ .x + nm1[cur_column()], .names = "{.col}_new"))
。 - akrunc_across
,即dat %>% rowwise %>% mutate(Anew = list((function(x) c(x[1]^2, x[2] + 5, x[3] + 1))(c_across(starts_with("C_"))))) %>% unnest_wider(Anew, names_sep = "")
。此外,你需要在数据中有C_3
,因为x[3]
对应第三列。 - akrun