2017-12-01 3 views
2

여러 개의 공백으로 고르지 않은 문자열을 분할하려고합니다. 그러나 분할 될 공간의 수는 항상 동일한 수는 아닙니다.R은 고르지 않은 공백 수를 가진 고르지 않은 문자열을 분할합니다.

"abc   20" 
"csd 10" 
"eds  10  30" 

나는 다음과 같은 얻기 위해 노력하고있어이 작업을 수행하는 방법에

"abc" " " "20" 
"csd" "10" " " 
"eds" "10" "30" 

어떤 생각? 고정 된 수의 공백을 기반으로하는 분할은 약간 다를 수 있으므로 가능하지 않습니다. 나는 정확하게 하나의 공간으로 나뉘어 지거나 또는 문자 나 숫자가 뒤 따르는 것에 대해 생각하고 있었지만, 어떻게해야하는지 전혀 모른다.

+1

왜 첫 번째는 중앙과 두 번째의 공간이 않는 한 끝에 공백은? – Gregor

+0

최종 데이터가 ... 세 변수처럼 보이는 방법입니다. 두 번째 변수에는 데이터가 기록되지 않았을 때 문자열에는 공백이 포함되는 반면 세 번째 변수에는 문자열이 잘려나갑니다. – Fred12

+0

하지만 어떻게 알 수 있습니까? 첫 번째 줄과 두 번째 줄은 모두 ""와 같이 표시되며 공백 수는 다양하므로 결과가 달라진다는 것을 어떻게 알 수 있습니까? 두 번째 행이 첫 번째 행처럼 잘리지 않는다는 것을 어떻게 알 수 있습니까? 논리를 설명 할 수 있다면 코드를 작성할 수 있습니다. – Gregor

답변

3

1) read.fwf 시도 read.fwf. 필요에 따라 너비를 조정하십시오.

s <- c("abc   20", "csd 10", "eds  10  30") # test data 
read.fwf(textConnection(s), widths = c(3, 7, 7)) 

주는 :

V1 V2 V3 
1 abc NA 20 
2 csd 10 NA 
3 eds 10 30 

2) kmeans이 방법은 시작 열을 발견 g 필드 (2, 3) 및 클러스터들을 두 그룹으로 kmeans을 사용. 그것은 필드 1이 항상 존재한다고 가정합니다. 그 이유는 질문에있는 것처럼 보입니다. 한 줄에 두 개의 필드가있는 경우 가장 가까운 그룹 센터에 두 번째 필드를 할당합니다.

km <- kmeans(unlist(gregexpr(" \\S", s)), 2) 
centers <- sort(km$centers) 
g <- gregexpr(" \\S", s) 
spl <- strsplit(s, " +") 
f <- function(s, g) { 
    if (length(s) == 2) paste0(s[1], strrep(",", which.min(abs(g - centers))), s[2]) 
    else paste(s, collapse = ",") 
} 
read.table(text = mapply(f, spl, g), sep = ",", fill = TRUE, as.is = TRUE) 

제공 :

V1 V2 V3 
1 abc NA 20 
2 csd 10 NA 
3 eds 10 30 
+0

거의 그곳에 있지만 첫 번째 행에는 V2가 NA 인 V3에 있어야합니다 ... 수동으로 너무 많은 행을 수행 할 수 없습니다. – Fred12

+1

고마워요! 불행히도 이것은 고정 된 수의 문자로 분리됩니다. 수동으로 너비를 조정하면 다른 행이 약간 다르고 길 너무 많아서 너무 많은 시간이 걸릴 것입니다 ... – Fred12

+0

아마도 내가 잘못된 것을하고 있는데 아마도 같은 것을 얻지는 못합니다 ... 기본적으로 얻을 수 있습니다 : "abc X20 X50 ""csd 10 60 NA ""eds 10 30 40 " – Fred12

관련 문제