2016-09-13 3 views
5

컬럼의 값이 파이프로 구분되고 파이프로 구분 된 값에서 더미 변수를 만드는 data.frame 컬럼을 얻는 데 관심이 있습니다. 사전에 얼마나 많은 잠재적 가치 모르겠어요파이프로 구분 된 데이터를 가진 컬럼을 더미 변수로 변환

df2 = data.frame(Ben = c(1, 1, 1), Chris = c(1, 0, 0), Jim = c(1, 1, 1), Greg = c(0, 1, 0), 
       Steve = c(0, 0, 1)) 
> df2 
    Ben Chris Jim Greg Steve 
1 1  1 1 0  0 
2 1  0 1 1  0 
3 1  0 1 0  1 

:

하는의 우리가 내가 함께 결말에 관심이

df = data.frame(a = c("Ben|Chris|Jim", "Ben|Greg|Jim|", "Jim|Steve|Ben")) 

> df 
       a 
1 Ben|Chris|Jim 
2 Ben|Greg|Jim 
3 Jim|Steve|Ben 

시작한다고 가정 해 봅시다 : 예를 들어

현장에 있습니다. 위의 예에서 변수 "a"는 1 개의 값 또는 10 개의 값을 포함 할 수 있습니다. 합리적인 숫자라고 가정하십시오 (즉, < 개의 가능한 값).

좋은 방법이 있습니까?

답변

6

또 다른 방법은 splitstackshape에서 cSplit_e을 사용하고 있습니다 꾸러미.

데이터 프레임을 afill으로 0과 drop 원래의 열로 나눕니다.

library(splitstackshape) 
cSplit_e(df, "a", "|", type = "character", fill = 0, drop = T) 

# a_Ben a_Chris a_Greg a_Jim a_Steve 
#1  1  1  0  1  0 
#2  1  0  1  1  0 
#3  1  0  0  1  1 
+1

위대한 발견. –

+1

대단한 답변 - 모두에게 감사드립니다. 나는 이것이 가장 단순하다고 느끼기 때문에이 하나가 최고인 것을 좋아한다. 감사! – dreww2

6

여기 dplyrtidyr를 사용하여 하나 개의 옵션입니다 :

library(dplyr) 
library(tidyr) 
df %>% tibble::rownames_to_column(var = "id") %>% 
     mutate(a = strsplit(as.character(a), "\\|")) %>% 
     unnest() %>% table() 

# a 
# id Ben Chris Greg Jim Steve 
# 1 1  1 0 1  0 
# 2 1  0 1 1  0 
# 3 1  0 0 1  1 

기본 R의 아날로그은 다음과 같습니다

df$a <- as.character(df$a) 
s <- strsplit(df$a, "|", fixed=TRUE) 
table(id = rep(1:nrow(df), lengths(s)), v = unlist(s)) 

데이터 :

df = data.frame(a = c("Ben|Chris|Jim", "Ben|Greg|Jim", "Jim|Steve|Ben")) 
2

우리는 'A'열 여기

library(qdapTools) 
mtabulate(strsplit(as.character(df$a), "|", fixed = TRUE)) 
# Ben Chris Greg Jim Steve 
#1 1  1 0 1  0 
#2 1  0 1 1  0 
#3 1  0 0 1  1 
0

분할 후 qdapTools에서 mtabulate를 사용하면

Ben Chris Jim Greg Steve 
1 1  1 1 0  0 
2 1  0 1 1  0 
3 1  0 1 0  1 

를 반환베이스 R

# get unique set of names 
myNames <- unique(unlist(strsplit(as.character(df$a), split="\\|"))) 
# get indicator data.frame 
setNames(data.frame(lapply(myNames, function(i) as.integer(grepl(i, df$a)))), myNames) 

방법이다 그만큼 첫 번째 줄은 strsplit을 사용하여 파이프 "|"에서 분리 된 이름 목록을 생성하고 unlistunique은 고유 한 이름 벡터를 생성합니다. 두 번째 줄은 lapply을 사용하여이 이름을 실행하고 grepl을 사용하여 이름을 검색합니다. as.integer은 이진 정수로 변환됩니다. 반환 된 목록은 setNames과 함께 data.frame 및 주어진 열 이름으로 변환됩니다.

관련 문제