2017-05-15 1 views
-2

열 x를 '|'로 나누어 x 값을 고유하게 계산하고 싶습니다. R에서 하위 문자열 2자를 남겼습니다.하나의 열에 대한 고유 수 - 구분 기호 및 하위 문자열에 대한 고유 수로 나뉩니다.

df <-data.frame(id = c(11,22,33,44), 
       x = c(NA,'cna|cnb|jpa|usa|jpb|usb','kra|krb|kru|usb|usa','jpa|jpu|epa|epb|usa|woa|cna|jpu')) 

> df 
    id        x 
1 11       <NA> 
2 22   cna|cnb|jpa|usa|jpb|usb 
3 33    kra|krb|kru|usb|usa 
4 44 jpa|jpu|epa|epb|usa|woa|cna|jpu 

아래에서 확인하고 싶습니다.

id count 
1 11 0 
2 22 3 
3 33 2   
4 44 5 
  • 라인 1 0
  • 라인 2 CN, JP 우리 (3 개 데이터)
  • 라인 3 KR, 우리 (2 개 데이터)이다
  • 선 4 JP, EP이다 , us, wo, cn (5 데이터)

답변

1

우리는 tidyverse을 사용할 수 있습니다. 요소를 'x'로 분할하고 separate_rows, mutate으로 'x'의 첫 번째 두 문자 (substr)를 'id'로 그룹화하여 길이가 긴 형식으로 확장하면 n_distinct

을 사용하여 고유 한 비 NA 요소 인 count을 찾습니다.
library(tidyverse) 
df %>% 
    separate_rows(x) %>% 
    mutate(x= substr(x, 1, 2)) %>% 
    group_by(id) %>% 
    summarise(count = n_distinct(x[!is.na(x)])) 
# A tibble: 4 x 2 
#  id count 
# <dbl> <int> 
#1 11  0 
#2 22  3 
#3 33  2 
#4 44  5 
+1

와우! 그것은 굉장합니다! 감사합니다 ~ – user3317871

+0

@ user3317871 감사합니다. 또한 [here] (http://stackoverflow.com/help/someone-answers) – akrun

2

다른 접근법이 있습니다. 그것은 작고 akrun의 답변으로 간단 아니지만, 어떤 라이브러리에 의존하지 않습니다

df$count <- sapply(df$x, function(varx){ 
    strs <- unique(sapply(unlist(strsplit(varx, "|", fixed = T)), function(string){ 
     substr(string, 1, 2) 
    })) 
    length(strs[!is.na(strs)]) 
}) 

출력 :

id        x count 
1 11       <NA>  0 
2 22   cna|cnb|jpa|usa|jpb|usb  3 
3 33    kra|krb|kru|usb|usa  2 
4 44 jpa|jpu|epa|epb|usa|woa|cna|jpu  5 
+1

좀 더 짧습니다 :'sapply (sapply (strsplit as.character (df $ x), '\\ |'), – Jaap

+1

@Jaap, 좀 더 짧아지면 (sapply가 적음)'sapply (strsplit (as는 strsplit (로 시작합니다. .character (df $ x), "|", fixed = TRUE), 함수 (x) 길이 (unique (substr (na.omit (x), 1, 2))))' –

+0

위대한 ~! 해결책은 매우 간단합니다! 고마워요! – user3317871

관련 문제