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

问题描述 投票:0回答:1

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

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

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

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

我在这里找到了一个解决方案:aggregate(.~Agentdepartment,df,function(x)paste0(unique(x),collapse =“/”),na.action = na.pass)。但它也在聚合Null值。

任何人都可以建议。

r dplyr aggregate
1个回答
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   
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.