2017-10-21 54 views
0

我是R初學者,目前面臨着我現在無法概念化的問題。 我已經看過幾個相關的職位,但還沒有發現除了有 一個明確的答案:
Aggregating rows with same Ids and retaining only unique entries in R相同ID行的聚合/連續字符值

但我的問題是有點不同。

這裏的初始DF我想使用的結構:

sta_RHP_metho(3528,4)的變量是:
- 「code.sandre」 女巫是ID,我將使用
- 「CodeOpera 「一個唯一的ID女巫與‘code.sandre’
- ‘Methode.de.peche’字符向量
- ‘年’

在這種df,可以有儘可能多的行作爲唯一的‘CodeOpera’(3528 )。有幾個「CodeOpera」由id /「code.sandre」,並有180個code.sandre

我想得到的是一個由「code.sandre」和「Methode.de。 peche「每年的角色價值。

我幾乎得到了通過處理下面的代碼:

x2<-melt(sta_RHP_metho,c("code.sandre","CodeOpera","year"),"Methode.de.peche") 
x3<-as.data.frame(dcast(x2,code.sandre + CodeOpera ~ year)) 

但我仍然有幾個之多行作爲唯一的「CodeOpera」(3528)和我說我不知道​​如何獲得獨特的rox通過ID。
需要注意的一點是,可能會有幾個「Methode.de.peche」,因此我可能需要在某些情況下連接返回的值。

希望我的解釋清楚。

評論將不勝感激;)

乾杯。

特里斯坦


謝謝@ANG。下面是最小的可重複的例子:

1 /將我我融化/ dcast手術後得到了數據幀:

code_sandre<-c("A","A","A","B","B","C","D") 
year1<-c("a",NA,"a","b",NA,"c","b") 
year2<-c("a","b",NA,"b","b","c","b") 
year3<-c("a","b",NA,NA,NA,"c","b") 
x<-data.frame(v1 =code.sandre,v2 =year1,v3 =year2, v4 =year3)) 

2 /我想獲得的數據框:

code_sandre<-c("A","B","C","D") 
year1<-c("a","b",NA,"b") 
year2<-c("a,b","b","c","b") 
year3<-c("a,b",NA,"c","b") 
result<-data.frame(code_sandre,year1,year2,year3) 
+2

Hello Tristan,歡迎來到StackOverflow(SO)。你能提供一個[最小可重現的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? – ANG

回答

0

我不知道我找到了你,但看起來你只是想要獨特的code.sandre,不管CodeOpera的價值。你得到嘗試此方法後的預期結果(檢查使用melt()前的結果):

library(data.table) 
setDT(sta_RHP_metho) 
# delete column "CodeOpera" 
sta_RHP_metho <- sta_RHP_metho[, CodeOpera := NULL] 
# take unique rows 
library(dplyr) 
sta_RHP_metho2 <- distinct(sta_RHP_metho) 

OR

我是能夠達到的目標。

code_sandre<-c("A","A","A","B","B","C","D") 
year1<-c("a",NA,"a","b",NA,"c","b") 
year2<-c("a","b",NA,"b","b","c","b") 
year3<-c("a","b",NA,NA,NA,"c","b") 
x<-data.frame(code_sandre =code_sandre, 
       year1 = year1, 
       year2 = year2, 
       year3 = year3) 
library(dplyr) 
x2 <- x %>% 
     group_by(code_sandre) %>% 
     summarise_at(.vars = vars(year1, year2, year3), 
        .funs = function(x) toString(unique(x[!is.na(x)]))) 
x2 
x3 <- as.data.frame(x2) 
x3[x3 == ""] <- NA 
x3 

我認爲它應該非常接近您的預期輸出。

+0

試試看'sta_RHP_metho2 < - as.data.frame(sta_RHP_metho2)',然後使用'melt()'。 – ANG

+0

這幾乎就是我想要的,但是我無法從你的'sta_RHP_metho2 < - distinct(sta_RHP_metho)'做熔化,那不是我想要輸出的數據幀結構。有效地,我希望在每個「code.sandre」中有一個唯一的行,並且在我的初始數據框中觀察到「year」的唯一列。對於行與列之間的每個交叉點,有3種可能性:沒有值(因爲當年沒有采樣),1值(因爲當年有一個獨特的「Methode.de.peche」,即使有多個CodeOpera) ,幾個值(幾個'「Methode.de.peche」')。也許數據框不適合我的情況?矩陣? –

+0

對不起,我的混亂評論我會改善我的語法 –