2017-10-20 1 views
1

다른 모든 열에서 발견 된 모든 단어를 수집하고 서식을 지정하는 내 열에서 새 열을 만들려고합니다. 가능한 경우 dplyr을 사용하여이 작업을 수행하려고합니다. 원래 DataFrame :dplyr mutate - 하나의 행을 함수 인수로 전달하려면 어떻게합니까?

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  

을 간단한 예를 들어

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

는, 내가 좋아하는 뭔가를 바라고 내 코드에서 출력은 다음과 같이 보입니다.

 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()를 사용하려고하면 함수에 전체 tibble을 전달하는 것처럼 보입니다. (이것은 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 = ' ') 
} 
+0

'myFunc'을 (를) 공유 할 수 있습니까?'df'는 어떻게 생겼습니까? – www

+0

어쩌면 내가 잘못 이해 한 것일까? df %> % mutate (newColumn = paste0 (columnA, columnB))'원하는 결과를 제공하지 않습니까? –

+0

나는 나의 질문을 위해 나의 기능을 단순화했다. 내가 사용하고있는 실제 기능이 내 게시물에 편집되었습니다. –

답변

1

가 여러 단항를 통해 결과를 임의의 컬럼에 체인에 임의의 기능을 적용 할 수 ?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 지금 × 2를 원래 data.frame에서 행으로 구성 data.frame의 (또는 tibble들)이 포함되어 있습니다. 이제 각각 myFuncmap을 사용하여 각각을 전달할 수 있습니다. 원하는

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의 각 행에인가 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 
# ... 

, unnestunnest(Result) 예컨대, 특정 컬럼에 제한 될 수있다.

편집 : 원래 data.frame는 두 개의 열이 포함되어 있기 때문에, 실제로 do 단계를 건너 뛰고 대신 purrr::map2를 사용할 수 있습니다. 구문은 map과 매우 유사합니다 :

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

myFunc 것을 이제 진 함수로 정의된다.

+0

이것은 그랬다! 정말 고맙습니다. –

+0

다행이었습니다. –

0

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