mutate()
for 루프 내 에서 함수를 사용하여 R의 목록에서 여러 열을 만드는 방법이 있는지 궁금합니다 .
내가 의미하는 바의 예는 다음과 같습니다.
문제 :
df
카테고리와 등급이라는 2 개의 열 이있는 데이터 프레임 이 있습니다. 해당 열의 모든 요소에 대해 열을 추가하고 df$category
싶습니다. 범주 열이 반복자와 일치하면 1이 필요합니다.
library(dplyr)
df <- tibble(
category = c("Art","Technology","Finance"),
rating = c(100,95,50)
)
수동으로 수행하면 다음과 같이 할 수 있습니다.
df <-
df %>%
mutate(art = ifelse(category == "Art", 1,0))
하지만 50 개의 카테고리가 있으면 어떻게됩니까? (내가 원래 문제에서 가지고있는 것과 비슷합니다. 시간이 많이 걸립니다!)
내가 시도한 것 :
category_names <- df$category
for(name in category_names){
df <-
df %>%
mutate(name = ifelse(category == name, 1,0))
}
불행히도 작동하지 않는 것 같습니다.
나는 주제에 대한 어떤 빛을 고맙게 생각합니다!
전체 코드 :
library(dplyr)
#Creates tibble
df <- tibble(
category = c("Art","Technology","Finance"),
rating = c(100,95,50)
)
#Showcases the operation I would like to loop over df
df <-
df %>%
mutate(art = ifelse(category == "Art", 1,0))
#Creates a variable for clarity
category_names <- df$category
#For loop I tried
for(name in category_names){
df <-
df %>%
mutate(name = ifelse(category == name, 1,0))
}
나는 내가 본질적으로하고있는 것이 다음과 같은 형태라는 것을 알고있다 model.matrix()
. 그러나 그 기능에 대해 알기 전에 나는 이전에하던 일이 왜 작동하지 않는지 여전히 당황했습니다.
pivot_wider
시퀀스 컬럼 생성 후 사용할 수 있습니다.
library(dplyr)
library(tidyr)
df %>%
mutate(rn = row_number(), n = 1) %>%
pivot_wider(names_from = category, values_from = n,
values_fill = list(n = 0)) %>%
select(-rn)
# A tibble: 3 x 4
# rating Art Technology Finance
# <dbl> <dbl> <dbl> <dbl>
#1 100 1 0 0
#2 95 0 1 0
#3 50 0 0 1
또는 다른 옵션은 map
library(purrr)
map_dfc(unique(df$category), ~ df %>%
transmute(!! .x := +(category == .x))) %>%
bind_cols(df, .)
# A tibble: 3 x 5
# category rating Art Technology Finance
#* <chr> <dbl> <int> <int> <int>
#1 Art 100 1 0 0
#2 Technology 95 0 1 0
#3 Finance 50 0 0 1
for
루프 가 필요한 경우
for(name in category_names) df <- df %>% mutate(!! name := +(category == name))
또는 base R
와table
cbind(df, as.data.frame.matrix(table(seq_len(nrow(df)), df$category)))
# category rating Art Finance Technology
#1 Art 100 1 0 0
#2 Technology 95 0 0 1
#3 Finance 50 0 1 0
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다