2017-02-02 6 views
0

大量のデータセットがあり、必要な情報の一部がセミコロンで区切られた文字列として最初の列に格納されています。Rのデータ文字列を要約するR

Information Data 
1 Forrest;Trees;Unknown 5 
2 Forrest;Trees;Leaves 1 
3 Forrest;Trees;Trunks 3 
4 Forrest;Shrubs;Unknown 4 
5 Forrest;Shrubs;Branches 2 
6 Forrest;Shrubs;Leaves 1 
7 Forrest;Shrubs;NA 3 
私は唯一の「不明」または「NA」私のデータフレームになるようではありません最後に固有の名前を持つように名前を簡素化するために必要な

を:たとえば、次のように与える

TestData <- data.frame("Information" = c("Forrest;Trees;Unknown", "Forrest;Trees;Leaves", "Forrest;Trees;Trunks", "Forrest;Shrubs;Unknown", "Forrest;Shrubs;Branches", "Forrest;Shrubs;Leaves", "Forrest;Shrubs;NA"), "Data" = c(5,1,3,4,2,1,3)) 

Information Data 
1 Trees;Unknown 5 
2 Trees;Leaves 1 
3 Trunks 3 
4 Shrubs;Unknown 4 
5 Branches 2 
6 Shrubs;Leaves 1 
7 Shrubs;NA 3 
+1

なぜ '木、トランクを最初の2つの行が 'Trees'プレフィックスを保持している間に' 'Trunk 'になりますか? –

+1

申し訳ありませんが、私はデータを簡素化するために必要な方法です。私はそれが私が与える文脈ではあまり意味がないと思う(私は単純な例を挙げようとしている)。私は最後の一意の名前に単純化する必要があります。 「Forrest; Trees; Leaves」を「Leaves」に変更した場合、「Forrest; Shrubs; Leaves」と「Leaves」が同じである必要があります。 – user2165857

答えて

1

おそらく最も効率的で洗練された解決策ではないかもしれませんが、サンプルデータで機能します。それはあなたのニーズにも十分なのですホープ:

同じ列に複数の変数を置くことをお勧めしませんが、使用してdplyrは何をしたいあなたを与える必要があります一般的に
library(stringr) 
library(dplyr) 


TestData <- data.frame("Information" = c("Forrest;Trees;Unknown", "Forrest;Trees;Leaves", "Forrest;Trees;Trunks", "Forrest;Shrubs;Unknown", "Forrest;Shrubs;Branches", "Forrest;Shrubs;Leaves", "Forrest;Shrubs;NA"), "Data" = c(5,1,3,4,2,1,3)) 

# split text into 3 columns 
TestData[3:5] <- str_split_fixed(TestData$Information, ";", 3) 

# filter Unknown and NA values, count frequencies to determine unique values 
a <- TestData %>% 
    filter(!V5 %in% c("Unknown", "NA")) %>% 
    group_by(V5) %>% 
    summarise(count = n()) 

# join back to original data 
TestData <- TestData %>% 
    left_join(a) 


TestData$Clean <- ifelse(TestData$count > 1 | is.na(TestData$count), paste0(TestData$V4, ";", TestData$V5), TestData$V5) 
0

TestData_filtered<-TestData%>%separate(Information,into=c("common","TS","BL"),remove=FALSE)%>%filter(!grepl("Unknown|NA",BL))%>%mutate(wanted=paste(TS,BL,sep=";"))