설정

2011-08-11 6 views
4

내가 분석하지만 내 데이터의 3 열로 구분을위한 dataframe에이 글을 읽을 필요가 설정

Deamon,Host,1:2:4,aaa.03 
Pixe,Paradigm,1:3:5,11.us 

처럼 보이는 CSV 가지고와 세트처럼 읽을 필요를 또는 1.e splitted by : list (1, 2, 4)를 반환합니다. R에 클래스 목록이있는 열을 가질 수 있습니까? 아니면 내가 어떻게이 문제에 접근 할 수 있다고 생각하십니까? 그 문자를 대체하는 GSUB를 사용하여

+1

세 번째 열에는 항상 콜론으로 구분 된 세 개의 숫자가 포함됩니까? 아니면 3 개 이상 가질 수 있습니까? –

+0

가끔은 3 개 이상의 숫자를 가질 수 있습니다. – damola

+0

':'의 수에 대한 답을보십시오. * nix OS가 무기고에있을 경우 'sed'또는 'awk'와 같은 것을 처리 할 수있는 다른 사전 처리 도구를 볼 수도 있습니다. – Chase

답변

4

당신은 구성 요소의 목록에 문자 벡터를 분할 strsplit을 사용할 수 있습니다 : 위에서 언급 한 바와 같이

x <- c("1:2:4", "1:3:5") 
strsplit(x, split=":") 
[[1]] 
[1] "1" "2" "4" 

[[2]] 
[1] "1" "3" "5" 
1

시도 :

R> str <- "1:2:4" 
R> str 
[1] "1:2:4" 
R> gsub(":", ",", str) 
[1] "1,2,4" 

가 열이 문자열이 아닌 미리 요인이 있는지 확인합니다.

4

는 대답은 열에 분리의 수가 일치 여부를 경우에 따라 달라질 수 있습니다. 그 숫자가 일치하면 대답은 더 솔직합니다. 여기 Andrie의 strsplit 대답 떨어져 그 건물을 하나의 대답 : 위에서 본질적으로 어떻게 colsplit.character 패키지 reshape에서 구현이며 적절한 이름을 부여 할 수 강제로 당신을 위해 더 좋은 옵션이 될 수 있습니다

dat <- read.csv("yourData.csv", header=FALSE, stringsAsFactors = FALSE) 

#If always going to be a consistent number of separators 
dat <- cbind(dat, do.call("rbind", strsplit(dat[, 3], ":"))) 

     V1  V2  V3  V4 1 2 3 
1 Deamon  Host 1:02:04 aaa.03 1 02 04 
2 Pixe Paradigm 1:03:05 11.us 1 03 05 

하는 것으로.

구분 기호의 수가 다른 경우 rbind.fill을 사용하는 것은 plyr 패키지의 옵션입니다. rbind.fill은 조금 짜증나는 data.frames를 기대하며, 행렬로 먼저 변환하지 않고 data.frame 행을 얻는 방법을 알아낼 수 없으므로보다 효율적으로 만들 수 있다고 상상할 수 있지만 기본적인 아이디어는 다음과 같습니다.

library(plyr) 
x <- c("1:2:4", "1:3:5:6:7") 
rbind.fill(
    lapply(
    lapply(strsplit(x, ":"), matrix, nrow = 1) 
    , as.data.frame) 
) 

    V1 V2 V3 V4 V5 
1 1 2 4 <NA> <NA> 
2 1 3 5 6 7 

위의 그림과 같이 cbind이 될 수 있습니다.

관련 문제