2017-07-29 26 views
0

我有一個數據與許多列。例如,這是一個三列如何統計和刪除列上的類似字符串

df<-structure(list(V1 = structure(c(5L, 1L, 7L, 3L, 2L, 4L, 6L, 6L 
), .Label = c("CPSIAAAIAAVNALHGR", "DLNYCFSGMSDHR", "FPEHELIVDPQR", 
"IADPDAVKPDDWDEDAPSK", "LWADHGVQACFGR", "WGEAGAEYVVESTGVFTTMEK", 
"YYVTIIDAPGHR"), class = "factor"), V2 = structure(c(5L, 2L, 
7L, 3L, 4L, 6L, 1L, 1L), .Label = c("", "CPSIAAAIAAVNALHGR", 
"GCITIIGGGDTATCCAK", "HVGPGVLSMANAGPNTNGSQFFICTIK", "LLELGPKPEVAQQTR", 
"MVCCSAWSEDHPICNLFTCGFDR", "YYVTIIDAPGHR"), class = "factor"), 
    V3 = structure(c(4L, 3L, 2L, 4L, 3L, 1L, 1L, 1L), .Label = c("", 
    "AVCMLSNTTAIAEAWAR", "DLNYCFSGMSDHR", "FPEHELIVDPQR"), class = "factor")), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -8L)) 

-The第一列,我們不看任何其他列呢,我們只算多少串有並保持獨特的一個

  • 的第二列,我們保持獨特的,也是我們去掉那些已經在第一列

  • 第三列,我們保持獨一無二的,我們刪除了在第一和第二列中的字符串

這持續了那麼多的列,因爲我們有

例如,對於這個數據,我們將通過tidyverse有以下

Column 1    Column 2     Column 3 
LWADHGVQACFGR 
CPSIAAAIAAVNALHGR  LLELGPKPEVAQQTR    AVCMLSNTTAIAEAWAR 
YYVTIIDAPGHR   GCITIIGGGDTATCCAK 
FPEHELIVDPQR   HVGPGVLSMANAGPNTNGSQFFICTIK 
DLNYCFSGMSDHR   MVCCSAWSEDHPICNLFTCGFDR 
IADPDAVKPDDWDEDAPSK  
WGEAGAEYVVESTGVFTTMEK 
+0

對不起,我一定是誤解了問題 – akrun

+0

@akrun如果你知道任何解決方案,我會很樂意接受它 – nik

+0

我有點忙,在某些型號的時刻運行 – akrun

回答

1

下面是一個解決方案,

library(tidyverse) 

df1 <- df %>% 
gather(var, string) %>% 
filter(string != '' & !duplicated(string)) %>% 
group_by(var) %>% 
mutate(cnt = seq(n())) %>% 
spread(var, string) %>% 
select(-cnt) 

哪給出

# A tibble: 7 x 4 
    cnt     V1       V2    V3 
* <int>     <chr>      <chr>    <chr> 
1  1   LWADHGVQACFGR    LLELGPKPEVAQQTR AVCMLSNTTAIAEAWAR 
2  2  CPSIAAAIAAVNALHGR   GCITIIGGGDTATCCAK    <NA> 
3  3   YYVTIIDAPGHR HVGPGVLSMANAGPNTNGSQFFICTIK    <NA> 
4  4   FPEHELIVDPQR  MVCCSAWSEDHPICNLFTCGFDR    <NA> 
5  5   DLNYCFSGMSDHR      <NA>    <NA> 
6  6 IADPDAVKPDDWDEDAPSK      <NA>    <NA> 
7  7 WGEAGAEYVVESTGVFTTMEK      <NA>    <NA> 

您可以使用colSums得到串的數量,

colSums(!is.na(df1)) 
#V1 V2 V3 
# 7 4 1 

通過基礎R類似的方法,將保存字符串列表中會,

df[] <- lapply(df, as.character) 
d1 <- stack(df) 
d1 <- d1[d1$values != '' & !duplicated(d1$values),] 
l1 <- unstack(d1, values ~ ind) 

lengths(l1) 
#V1 V2 V3 
# 7 4 1 
+0

你可以在每一列上添加每列的字符串數而不是嗎? – nik

+0

你是什麼意思? 就是數據框在控制檯中的顯示方式。你的意思是在頂部添加另一行字符串數(7,4,1)? – Sotos

+0

我得到了這個錯誤'錯誤中選擇(-cnt):對象'cnt'找不到' – nik

1

基本的R解決方案。 df2是最終的輸出。

# Convert to character 
L1 <- lapply(df, as.character) 
# Get unique string 
L2 <- lapply(L1, unique) 
# Remove "" 
L3 <- lapply(L2, function(vec){vec <- vec[!(vec %in% "")]}) 

# Use for loop to remove non-unique string from previous columns 
for (i in 2:length(L3)){ 
    previous_vec <- unlist(L3[1:(i - 1)]) 
    current_vec <- L3[[i]] 
    L3[[i]] <- current_vec[!(current_vec %in% previous_vec)] 
} 

# Get the maximum column length 
max_num <- max(sapply(L3, length)) 

# Append "" to each column 
L4 <- lapply(L3, function(vec){vec <- c(vec, rep("", max_num - length(vec)))}) 

# Convert L4 to a data frame 
df2 <- as.data.frame(do.call(cbind, L4)) 
+0

我喜歡你的答案 – nik