programing

원래 변수는 그대로 유지하면서 mutate_at로 새 변수 만들기

muds 2023. 11. 7. 21:09
반응형

원래 변수는 그대로 유지하면서 mutate_at로 새 변수 만들기

다음과 같은 간단한 예를 생각해 보십시오.

library(dplyr)
library(tibble)

dataframe <- tibble(helloo = c(1,2,3,4,5,6),
                        ooooHH = c(1,1,1,2,2,2),
                        ahaaa = c(200,400,120,300,100,100))

# A tibble: 6 x 3
  helloo ooooHH ahaaa
   <dbl>  <dbl> <dbl>
1      1      1   200
2      2      1   400
3      3      1   120
4      4      2   300
5      5      2   100
6      6      2   100

여기에 그 기능을 적용하고 싶습니다.ntile포함된 모든 열에oo, 하지만 저는 이 새로운 칼럼들을cat+ 대응란

내가 할 수 있다는 걸 알아요

dataframe %>% mutate_at(vars(contains('oo')), .funs = funs(ntile(., 2)))
# A tibble: 6 x 3
  helloo ooooHH ahaaa
   <int>  <int> <dbl>
1      1      1   200
2      1      1   400
3      1      1   120
4      2      2   300
5      2      2   100
6      2      2   100

하지만 내게 필요한 건 이건

# A tibble: 8 x 5
  helloo   ooooHH   ahaaa cat_helloo cat_ooooHH
     <dbl>    <dbl> <dbl>    <int>    <int>
1        1        1   200        1        1
2        2        1   400        1        1
3        3        1   120        1        1
4        4        2   300        2        2
5        5        2   100        2        2
6        5        2   100        2        2
7        6        2   100        2        2
8        6        2   100        2        2

중간 데이터를 저장하고 원래 데이터 프레임으로 다시 병합할 필요가 없는 솔루션이 있습니까?

dplyr 1.0.0에 대한 2020-06 업데이트

dplyr 1.0.0부터 시작하여,across()함수는 다음과 같은 함수의 "범위 변형"을 대체합니다.mutate_at(). 코드는 상당히 친숙하게 보여야 합니다.across(), 그 안에 내포되어 있는mutate().

목록에 지정한 함수에 이름을 추가하면 함수 이름이 접미사로 추가됩니다.

dataframe %>%
     mutate( across(contains('oo'), 
                    .fns = list(cat = ~ntile(., 2))) )

# A tibble: 6 x 5
  helloo ooooHH ahaaa helloo_cat ooooHH_cat
   <dbl>  <dbl> <dbl>      <int>      <int>
1      1      1   200          1          1
2      2      1   400          1          1
3      3      1   120          1          1
4      4      2   300          2          2
5      5      2   100          2          2
6      6      2   100          2          2

1.0.0에서는 새 열 이름을 변경하는 것이 조금 더 쉽습니다..names의 논쟁.across(). 접미사 대신 접두사로 함수 이름을 추가하는 예는 다음과 같습니다.글루 구문을 사용합니다.

dataframe %>%
     mutate( across(contains('oo'), 
                    .fns = list(cat = ~ntile(., 2)),
                    .names = "{fn}_{col}" ) )

# A tibble: 6 x 5
  helloo ooooHH ahaaa cat_helloo cat_ooooHH
   <dbl>  <dbl> <dbl>      <int>      <int>
1      1      1   200          1          1
2      2      1   400          1          1
3      3      1   120          1          1
4      4      2   300          2          2
5      5      2   100          2          2
6      6      2   100          2          2

mutate_at()이 있는 원래 답변

dplyr의 변경 사항을 반영하도록 편집되었습니다.dplyr 0.8.0 기준,funs()사용되지 않습니다.list()와 함께~대신 사용해야 합니다.

전달할 목록에 함수 이름을 지정할 수 있습니다..funs접미사로 이름을 붙여 새 변수를 만듭니다.

dataframe %>% mutate_at(vars(contains('oo')), .funs = list(cat = ~ntile(., 2)))

# A tibble: 6 x 5
  helloo ooooHH ahaaa helloo_cat ooooHH_cat
   <dbl>  <dbl> <dbl>      <int>      <int>
1      1      1   200          1          1
2      2      1   400          1          1
3      3      1   120          1          1
4      4      2   300          2          2
5      5      2   100          2          2
6      6      2   100          2          2

만약 당신이 그것을 접두사로 원한다면, 당신은 다음을 사용할 수 있습니다.rename_at이름을 바꾸려고 합니다

dataframe %>% 
     mutate_at(vars(contains('oo')), .funs = list(cat = ~ntile(., 2))) %>%
     rename_at( vars( contains( "_cat") ), list( ~paste("cat", gsub("_cat", "", .), sep = "_") ) )

# A tibble: 6 x 5
  helloo ooooHH ahaaa cat_helloo cat_ooooHH
   <dbl>  <dbl> <dbl>      <int>      <int>
1      1      1   200          1          1
2      2      1   400          1          1
3      3      1   120          1          1
4      4      2   300          2          2
5      5      2   100          2          2
6      6      2   100          2          2

이전코드와funs()이전 버전의 dplyr에서:

dataframe %>% 
     mutate_at(vars(contains('oo')), .funs = funs(cat = ntile(., 2))) %>%
     rename_at( vars( contains( "_cat") ), funs( paste("cat", gsub("_cat", "", .), sep = "_") ) )

언급URL : https://stackoverflow.com/questions/45947787/create-new-variables-with-mutate-at-while-keeping-the-original-ones

반응형