[英]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.