聚合/连接相同ID行的字符值

时间:2017-10-21 17:18:12

标签: r dataframe data-manipulation

我是R初学者,目前面临一个我现在无法概念化的问题。 我看了几个相关的帖子,但除了那里没有找到具体的答案  :
Aggregating rows with same Ids and retaining only unique entries in R

但我的问题有点不同。

这是我想要使用的初始df的结构:

sta_RHP_metho(3528,4)变量是:
- “code.sandre”女巫是我将使用的身份证 - “CodeOpera”一个独特的id巫婆与“code.sandre”相关 - “Methode.de.peche”字符向量
- “年”

在那个df中,行数和唯一的“CodeOpera”(3528)一样多。 id /“code.sandre”有几个“CodeOpera”,有180个code.sandre

我想得到的是一个带有“code.sandre”唯一行的df和每年的“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),正如我所说,我不知道如何通过ID获得一个独特的rox。
需要注意的是,有可能在年份之前有几个“Methode.de.peche”,所以在某些情况下我可能需要连接返回的值。

希望我的解释清楚。

将非常感谢评论;)

干杯。

特里斯坦

谢谢@ANG。这是可重现性最小的例子:

1 /我在融化/播放操作后得到的数据帧:

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)

1 个答案:

答案 0 :(得分: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

我认为它应该非常接近你的预期输出。