簡體   English   中英

dplyr mutate-如何將一行作為函數參數傳遞?

[英]dplyr mutate - How do I pass one row as a function argument?

我試圖在我的標題中創建一個新列,該列收集並格式化在所有其他列中找到的所有單詞。 如果可能,我想使用dplyr進行此操作。 原始DataFrame:

df <- read.table(text =      "  columnA     columnB      
                 1            A           Z                    
                 2            B           Y                    
                 3            C           X                    
                 4            D           W                    
                 5            E           V                   
                 6            F           U            "  ) 

作為一個簡化的示例,我希望執行以下操作:

df %>%
    rowwise() %>%
    mutate(newColumn = myFunc(.))

並使輸出如下所示:

       columnA     columnB      newColumn
1            A           Z             AZ        
2            B           Y             BY        
3            C           X             CX        
4            D           W             DW        
5            E           V             EV        
6            F           U             FU       

當我在代碼中嘗試此操作時,輸出如下所示:

       columnA     columnB      newColumn
1            A           Z             ABCDEF        
2            B           Y             ABCDEF        
3            C           X             ABCDEF    
4            D           W             ABCDEF    
5            E           V             ABCDEF    
6            F           U             ABCDEF

myFunc應該以一行作為參數,但是當我嘗試使用rowwise()時,我似乎正在將整個小節傳遞到函數中(我可以通過將打印函數添加到myFunc中來看到這一點)。

我如何只傳遞一行並迭代地執行此操作,以便它將函數應用於每一行? 可以使用dplyr完成嗎?

編輯:

出於我的問題,示例中的myFunc已簡化。 實際功能如下所示:

get_chr_vector <- function(row) {

    row <- row[,2:ncol(row)] # I need to skip the first row
    words <- str_c(row, collapse = ' ')
    words <- str_to_upper(words)
    words <- unlist(str_split(words, ' '))
    words <- words[words != '']
    words <- words[!nchar(words) <= 2]
    words <- removeWords(words, stopwords_list) # from the tm library
    words <- paste(words, sep = ' ', collapse = ' ')
}

看一下?dplyr::do?purrr::map ,它們允許您將任意函數應用於任意列,並通過多個一元運算符鏈接結果。 例如,

df1 <- df %>% rowwise %>% do( X = as_data_frame(.) ) %>% ungroup
# # A tibble: 6 x 1
#                  X
# *           <list>
# 1 <tibble [1 x 2]>
# 2 <tibble [1 x 2]>
# ...

請注意,列X現在包含1x2的data.frame S(或tibble從原來的由行的S) data.frame 您現在可以使用map將每個傳遞給自定義myFunc

myFunc <- function(Y) {paste0( Y$columnA, Y$columnB )}
df1 %>% mutate( Result = map(X, myFunc) )
# # A tibble: 6 x 2
#                  X    Result
#             <list>    <list>
# 1 <tibble [1 x 2]> <chr [1]>
# 2 <tibble [1 x 2]> <chr [1]>
# ...

現在, Result列包含data.frame應用於原始data.frame每一行的myFunc的輸出。 您可以通過串聯tidyr::unnest操作來檢索值。

df1 %>% mutate( Result = map(X, myFunc) ) %>% unnest
# # A tibble: 6 x 3
#   Result columnA columnB
#    <chr>  <fctr>  <fctr>
# 1     AZ       A       Z
# 2     BY       B       Y
# 3     CX       C       X
# ...

如果需要,可以將unnest限於特定的列,例如unnest(Result)

編輯 :因為您的原始data.frame僅包含兩列,所以您實際上可以跳過do步驟並改用purrr::map2 語法與map非常相似:

myFunc <- function( a, b ) {paste0(a,b)}
df %>% mutate( Result = map2( columnA, columnB, myFunc ) )

請注意,現在將myFunc定義為二進制函數。

這應該工作

   df <- read.table(text =      "  columnA     columnB      
                 1            A           Z                    
                 2            B           Y                    
                 3            C           X                    
                 4            D           W                    
                 5            E           V                   
                 6            F           U            "  )  

df %>%
  mutate(mutate_Func = paste0(columnA,columnB))

   columnA columnB mutate_Func
1       A       Z          AZ
2       B       Y          BY
3       C       X          CX
4       D       W          DW
5       E       V          EV
6       F       U          FU

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM