提问者:小点点

根据列比较数据帧中的值,如果值不同,则连接它们并删除R中的另一行


我有一个数据集,看起来像这样:

https://i.stack.imgur.com/5W0HU.png

我想根据“代理部门”比较所有列。如果值相同,则按原样提取,如果不同,则通过“/”连接两个值,然后删除下行。对于NA,我不希望它们合并,即如果一列为Null而另一列为非空,则保留非空值。如果两者都为NULL,则保留NULL。所以我希望每个部门都有一行。这就是我希望最终数据集的样子:

https://i.stack.imgur.com/8B819.png

我在这里找到了一个解决方案:聚合(.~Agent部门,df,函数(x)paste0(唯一(x),崩溃 = "/"), na. action=na.pass)。但它也在聚合空值。

有人能建议吗?


共1个答案

匿名用户

应该有更有效的方法,但这行得通。

Agent <- read.csv("Agent.csv")
Agent
  AgentDepartment AgentId SignDate Experience
1               A     101 30-01-20          1
2               A     102 30-01-20          2
3               B     103 25-06-20          1
4               B     103 20-05-20          4
5               C     104 19-08-20          5
6               C     105     <NA>          5
7               D      NA     <NA>          6

Agent$SignDate <- as.Date(Agent$SignDate)


Agent_fixed <- Agent %>% group_by(AgentDepartment) %>% summarise( AgentId  = toString(unique(AgentId)),
                                                   SignDate = toString(na.omit(unique(SignDate))),
                                                   Experience = toString(na.omit(unique(Experience))))
Agent_fixed$SignDate[Agent_fixed$SignDate == ""] <- NA
Agent_fixed$AgentId <- gsub(", ", "/", Agent_fixed$AgentId)
Agent_fixed$SignDate <- gsub(", ", "/", Agent_fixed$SignDate)
Agent_fixed$Experience <- gsub(", ", "/", Agent_fixed$Experience)

Agent_fixed
  AgentDepartment AgentId SignDate          Experience   
1 A               101/102 30-01-20          1/2       
2 B               103     25-06-20/20-05-20 1/4       
3 C               104/105 19-08-20          5         
4 D               NA      NA                6