【发布时间】:2017-05-30 14:03:01
【问题描述】:
我正在尝试使用自定义函数来使用 pipe mutate 语句。我看起来有点像SO post,但徒劳无功。
假设我有一个这样的数据框(其中blob 是一些与特定任务无关的变量,但它是整个数据的一部分):
df <-
data.frame(exclude=c('B','B','D'),
B=c(1,0,0),
C=c(3,4,9),
D=c(1,1,0),
blob=c('fd', 'fs', 'sa'),
stringsAsFactors = F)
我有一个使用变量名称的函数,因此请根据exclude 列中的值选择一些,例如计算 exclude 中未指定的变量的总和(始终为单个字符)。
FUN <- function(df){
sum(df[c('B', 'C', 'D')] [!names(df[c('B', 'C', 'D')]) %in% df['exclude']] )
}
当我给FUN 提供单行(第1 行)时,我得到C 和D(exclude 未提及的那些)的预期总和,即 4:
FUN(df[1,])
如何在带有 mutate 的管道中进行类似操作(将结果添加到变量 s)。这两个尝试都不起作用:
df %>% mutate(s=FUN(.))
df %>% group_by(1:n()) %>% mutate(s=FUN(.))
更新 这也不能按预期工作:
df %>% rowwise(.) %>% mutate(s=FUN(.))
这是有原因的,但不在 dplyr 的变异(和管道)内:
df$s <- sapply(1:nrow(df), function(x) FUN(df[x,]))
【问题讨论】:
-
你能举个例子吗?这不起作用:
df %>% rowwise(.) %>% mutate(s=FUN(.))。 @konvas 的回答显得有些笨拙(请参阅我对@konvas 建议的评论) -
对不起,我误会了。你可以
df %>% rowwise(.) %>% mutate(s=FUN(data.frame(exclude = exclude, B = B, C = C, D = D))),或df %>% rowwise() %>% nest(exclude:D) %>% mutate(s = map_dbl(data, FUN)) %>% unnest()。问题是dplyr不会自然地对子数据帧进行操作,而是对列(即向量)进行操作。所以需要一些额外的技巧。 -
这就是我所追求的! (备案:
tidyr::nest()和purrr::map_dbl())。