2017-10-21 53 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

对不起,我的混乱评论我会改善我的语法 –