比较数据列中基于列的值,如果值不同则将它们连接起来并删除R中的另一行

时间:2018-09-02 13:53:13

标签: r dplyr aggregate

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

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

我想比较基于“ Agentdepartment”的所有列。如果值相同,则按原样拾取;如果值不同,则通过'/'将两个值连接起来,然后删除下一行。在不适用NA的情况下,我不希望它们被合并,即如果一列具有Null值而其他非null值,则保留该非null值。如果两者都具有NULL,则保留NULL。所以我希望每个部门都有一行。这就是我希望最终数据集的样子:

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

我在这里找到了解决方案: 集合(。〜Agent部门,df,函数(x)paste0(唯一(x),折叠=“ /”),na.action = na.pass)。但是它也在聚合Null值。

任何人都可以建议。

1 个答案:

答案 0 :(得分:0)

应该有一种更有效的方法,但这可行。

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