我想使用管道mutate語句使用自定義函數。我看起來有點類似SO post但徒勞無功。 說我有這樣一個數據幀(其中blob
一些變量不涉及到具體的任務,而是整個數據的一部分):R:逐行dplyr ::使用函數獲取數據幀行並返回一個整數
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']])
}
當我給出了一個單行(行1)FUN
我得到的C
和D
(那些沒有被exclude
提及),即4的預期總和:
FUN(df[1,])
我如何在具有mutate的管道中做相似的操作(將結果添加到變量s
)。這兩種嘗試不起作用:
df %>% mutate(s=FUN(.))
df %>% group_by(1:n()) %>% mutate(s=FUN(.))
UPDATE 如預期這也不起作用:
df %>% rowwise(.) %>% mutate(s=FUN(.))
這個工作的原因,但不是dplyr的mutate內(和管道):
df$s <- sapply(1:nrow(df), function(x) FUN(df[x,]))
你能舉個例子嗎?這不起作用:'df%>%rowwise(。)%>%mutate(s = FUN(。))''。 @konvas的答案看起來有些複雜(請參閱我對@ konvas的建議的評論) – user3375672
對不起,我誤解了。您可以執行'df%>%rowwise(。)%>%mutate(s = FUN(data.frame(exclude =排除,B = B,C = C,D = D)))'或'df%>%rowwise()%>%nest(排除:D)%> mutate(s = map_dbl(data,FUN)) %>%unnest()'。問題是'dplyr'自然不能在子數據框架上運行,而在列(即向量)上運行。所以一些額外的技巧將是必要的。 – Axeman
這就是我以後的更多! (記錄:它是'tidyr :: nest()'和'purrr :: map_dbl()')。 – user3375672