2017-06-13 111 views
1

假設我有以下數據幀:數據框 - 唯一值

table<-data.frame(col1=c("ab ac", "ac", "ab", "ab ab", "ab","ac ac ac", "aa aa ab","aa ab ac")) 

     col1 
1 ab ac  
2  ac 
3  ab 
4 ab ab 
5  ab 
6 ac ac ac 
7 aa aa ab  
8 aa ab ac  

而且我想創建一個具有唯一值的另一列如果只有一個值,或者如果存在兩個或三個相似的人,或者在另一方面,每列中不同值的數量。

table<-data.frame(col1=c("ab ac", "ac", "ab", "ab ab", "ab","ac ac ac", "aa aa ab","aa ab ac"),col2=c("2","ac","ab","ab","ab","ac","2","3")) 

     col1 col2 
1 ab ac 2 
2  ac ac 
3  ab ab 
4 ab ab ab 
5  ab ab 
6 ac ac ac ac 
7 aa aa ab 2 
8 aa ab ac 3 

有人可以幫我完成這個任務。

+1

嘗試另一種選擇,避免現有研發功能後命名您的dataframes(比如'table') – Sotos

回答

1

這裏是tidyverse

library(tidyverse) 
table %>% 
    mutate(colN = col1) %>% 
    rownames_to_column("rn") %>% 
    separate_rows(colN) %>% 
    group_by(rn) %>% 
    summarise(col1 = first(col1), 
       col2 = n_distinct(colN), 
       col2 = replace(col2, col2==1, unique(colN))) %>% 
    select(-rn) 
# A tibble: 8 x 2 
#  col1 col2 
# <fctr> <chr> 
#1 ab ac  2 
#2  ac ac 
#3  ab ab 
#4 ab ab ab 
#5  ab ab 
#6 ac ac ac ac 
#7 aa aa ab  2 
#8 aa ab ac  3 
2

這裏有一個想法,

sapply(strsplit(table$col1, ' '), function(i) ifelse(length(unique(i)) > 1, length(unique(i)), i)) 
#[1] "2" "ac" "ab" "ab" "ab" "ac" "2" "3"