2017-10-21 2 views
0

c(#142#856#856.2#745, NA, #856#855, NA, #685, #663, #965.23, #855#658#744#122)과 같은 태그가있는 벡터가 있습니다.태그가 지정된 단어에서 열 만들기

단어는 날카롭게 구분됩니다. 각 다른 코드에 대해 하나의 열이있는 데이터 프레임을 만든 다음 그 행에 해당 코드가 있는지에 따라 1 또는 0 (또는 NA)을 씁니다.

아이디어는 각 요소가 행이되고 각 코드가 열이되고 코드가 해당 요소에 있으면 열이 1로 표시되거나 해당 코드가 해당 요소에없는 경우 0으로 표시된다는 것입니다.

ID | 142 | 856 |856.2 | ... | 122 | 
1 | 1 | 1 | 1 | ... | 0 | 
2 | 0 | 0 | 0 | ... | 0 | 
... 

저는 복잡한 알고리즘을 많이 사용하는 방법을 알고 있습니다. 그러나 쉬운 방법으로 쉽게이 작업을 수행 할 수 있습니까?

+1

이 부분을 설명해 줄 수 있습니까? 해당 코드가 해당 행에 있는지 여부에 따라 달라질 수 있습니까? 'ID '는 어디에서 왔습니까? – PoGibas

답변

2

하면 비교적 쉽게 stringr를 사용하여이를 달성 할 수

# First we load the package 
library(stringr) 
# Then we create your example data vector 
tagged_vector <- c('#142#856#856.2#745', NA, '#856#855', NA, '#685', '#663', 
        '#965.23', '#855#658#744#122') 
# Next we need to get all the unique codes 
# stringr's str_extract_all() can do this: 
all_codes <- str_extract_all(string=tagged_vector, pattern='(?<=#)[0-9\\.]+') 
# We just looked for one or more numbers and/or dots following a '#' character 
# Now we just want the unique ones: 
unique_codes <- unique(na.omit(unlist(all_codes))) 
# Then we can use grepl() to check whether each code occurs in any element 
# I've also used as.numeric() since you want 0/1 instead of TRUE/FALSE 
result <- data.frame(sapply(unique_codes, function(x){ 
    as.numeric(grepl(x, tagged_vector)) 
})) 
# Then we add in your ID column and move it to the front: 
result$ID <- 1:nrow(result) 
result <- result[ , c(ncol(result), 1:(ncol(result)-1))] 

결과는 사용자가 "X"는 각 코드 앞에 열 이름에서 알 수

ID X142 X856 X856.2 X745 X855 X685 X663 X965.23 X658 X744 X122 
1 1 1 1  1 1 0 0 0  0 0 0 0 
2 2 0 0  0 0 0 0 0  0 0 0 0 
3 3 0 1  0 0 1 0 0  0 0 0 0 
4 4 0 0  0 0 0 0 0  0 0 0 0 
5 5 0 0  0 0 0 1 0  0 0 0 0 
6 6 0 0  0 0 0 0 1  0 0 0 0 
7 7 0 0  0 0 0 0 0  1 0 0 0 
8 8 0 0  0 0 1 0 0  0 1 1 1 

이다. R a variable name may not begin with a number에 있기 때문입니다.

+0

고마워, 바로 이거 야. 나는 그 설명을 더 분명하게 바꾸었다. – Xbel

+0

도움이 되니 기쁩니다. – duckmayr