2017-05-15 38 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'通過僅採用由'id'分組的第一個兩個字符(substr),使用n_distinct

找到 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),'\\ |'), substr,start = 1,stop = 2),function(x)length(unique(na.omit(x))))' – Jaap

+1

@Jaap,稍微短一些(少一個sapply)就是'sapply(strsplit .character(df $ x),「|」,fixed = TRUE),函數(x)長度(unique(substr(na.omit(x),1,2))))' –

+0

很棒〜!解決方案非常簡單!非常感謝你! – user3317871

相關問題