2015-02-04 4 views
2

내 dataframe의 열이 있습니다단일 열의 내용을 R에서 두 개의 개별 열로 나누는 방법?

Col1   Col2 
20151102 
19920311 
20130204 
      >=70 
      60-69 
      20-29 

어떻게이 결과를 얻을 수 있습니다 :

Colname 
20151102 
19920311 
20130204 
>=70 
60-69 
20-29 

내가 좋아하는 두 개의 컬럼에이 열을 분할하려면?

+1

하는'do.call (cbind, 분할 (DF, cumsum (grepl을 (시도 '>', df $ Colname))))'두 개의 분리 된 컬럼으로 원한다면. – akrun

+0

@akrun 나는 그것을 좋아한다. 그것을 게시해야한다 –

+0

@DavidArenburg 그러나 OP가 필요하지 않은 것 같다 :-) – akrun

답변

3

0

Regular expression visualization

:

df[,c("Col1", "Col2")] <- "" 

isnum <- suppressWarnings(!is.na(as.numeric(df$colname))) 

df$Col1[isnum] <- df$colname[isnum] 
df$Col2[!isnum] <- df$colname[!isnum] 

df <- df[,!(names(df) %in% "colname")] 

데이터 :

df = data.frame(colname=c("20151102","19920311","20130204",">=70","60-69","20-29"), stringsAsFactors=FALSE) 
+0

이 접근 방식은 결과를 yeilding하지 않습니다. – Abhishek

+1

나쁘다. 데이터 프레임을 만들 때 정확한'stringsAsFactors = FALSE'를 잊어 버렸다. 이제는 효과가 있습니다. –

+0

감사합니다.이 일을 :) – Abhishek

3

가능한 한 가지 해결책은 extracttidyr에서 사용하는 것입니다. 내가 선택한 구분 기호 (점)가 처음 data.frame에 나타나서는 안됩니다.

library(magrittr) 
library(tidyr) 

df$colname = df$colname %>% 
      grepl("[>=|-]+", .) %>% 
      ifelse(paste0(".", df$colname), paste0(df$colname, ".")) 

extract(df, colname, c("col1","col2"), "(.*)\\.(.*)") 
#  col1 col2 
#1 222222  
#2 1111111  
#3   >=70 
#4   60-69 
#5   20-29 

데이터 : 여기

df = data.frame(colname=c("222222","1111111",">=70","60-69","20-29")) 
+0

'tidyr :: extract'가'magrittr : extract'에 의해 마스크되어 있기 때문에 코드가 작동하지 않으면'library()'호출을 바꾸어야합니다. – alex23lemm

+0

이 접근법은 유망 해 보이고 작동하지만, tidyr를 사용할 수 없습니다. – Abhishek

+0

오류 메시지에 "라이브러리 (tidyr)의 오류 : 'tidyr'이라는 패키지가 없습니다." – Abhishek

1

은 하나의 문장 솔루션입니다. read.pattern은 괄호로 묶인 일반 표현식 부분에서 두 필드 유형을 따로 캡처합니다. 합니다 (Colname 열이 클래스 "character" 이미 경우 format 생략 할 수있다 또한, 상기 첫 번째 컬럼의 숫자를 가질 것이 요구된다면 다음 colClasses 인수를 생략.).

library(gsubfn) 
read.pattern(text = format(DF$Colname), pattern = "(^\\d+$)|(.*)", 
        col.names = c("Col1", "Col2"), colClasses = "character") 

을주는 :

 col1  col2 
1 20151102   
2 19920311   
3 20130204   
4   >=70  
5   60-69 
6   20-29 

참고

(^\d+$)|(.*) 
: 여기
사용할 정규식의 시각화 모든 패키지의 필요없이

Debuggex Demo

관련 문제