将具有相同ID的行合并。

3

编辑:由于我的问题描述不够精确,导致回答由于类型无效而失败,因此我将Var4更改为字符串值。对此感到抱歉。

这是我在这里的第一个问题,希望有人能帮助我。

我有以下数据集:

ID Date N_Date Var1 Var2 Var3 Var4 type
1 4.7.22 50000 12 NA NA NA normal
1 4.7.22 50000 NA 23 NA NA normal
1 4.7.22 50000 NA NA 5 NA normal
1 4.7.22 50000 NA NA NA asd normal
2 4.7.22 50000 NA 2 NA NA normal
3 5.7.22 20000 7 NA NA NA normal
我的目标是每个ID只有一行数据。所以我想让R对每个ID的Var列值进行向上移动或组合。正如您所看到的,目前每行Var列中都只有一个值。因此,应该很容易用相应的“实际值”重写NA。我还发现了类似的问题,但答案没有帮助我:

如何在R中组合具有相同标识符的行?

我认为我的问题在于,我有像“date”、“N_date”(即该日期上的观测次数)和“type”这样的列。在这些情况下,我的代码应该看到,相应ID的值完全相同,只需取第一个值就可以了。

这样最终就会得到3行具有相同数量列的数据,包含所有信息。

非常感谢任何有想法解决此问题的人。


欢迎来到SO。如果您确定每个ID在每列中只有一个非缺失值,那么总结可能是最简单的选项,就像您已经找到的帖子中所指示的那样。请说明为什么该解决方案对您无效。根据您提供的信息,我认为它应该有效。请注意,在dplyr的最新版本中,summarise_all已被summarise(across(...))取代。我投票将其关闭为重复项,但如果您解释原因,则会撤回。 - Limey
如果您尝试执行以下代码 `df[is.na(df)] <- 0df %>% group_by(ID) %>% summarise_if(is.numeric, sum, na.rm = TRUE) %>% distinct()`,您将得到预期的结果。 - Isaac
我不确定,但是使用在重复分类答案中提供的na.omit将无法解决OP的问题(他们自己在该网站上指出了答案)。如果这是真的(再次强调我不确定),那么这就不是重复! - TarJae
你好 Limey,当我尝试运行另一个问题解决方案中的代码时,它对我不起作用。我收到错误消息“在summarise()中出现错误:在回收“type =(function(object,...)....”时出现问题。类型必须是大小为0或1,而不是2。早期的列大小为0”。 - Aisberg
抱歉造成了误解。我执行了df [is.na(df)] <- 0而不是df <- 0。仍然出现相同的错误消息(我认为是因为var4不是数字而包含字符串)。我现在还检查了删除所有字符串列,只是为了测试代码(df [is.na(df)] <- 0 df%>%group_by(ID)%>% summarise_if(is.numeric,sum,na.rm = TRUE)%>% distinct())是否有效。我不再收到错误消息,但除了将NA更改为0之外,它并没有减少数据集中的列数。 - Aisberg
显示剩余2条评论
1个回答

3

类似于这样: 在此,我们首先对除Var变量之外的所有变量进行分组,然后使用summarise(across...,如@Limey在评论部分建议的那样。 主要特点是使用na.rm=TRUE

library(dplyr)

df %>% 
  group_by(ID, Date, N_Date, type) %>% 
  summarise(across(starts_with("Var"), ~sum(., na.rm = TRUE)))

     ID Date   N_Date type    Var1  Var2  Var3  Var4
  <int> <chr>   <int> <chr>  <int> <int> <int> <int>
1     1 4.7.22  50000 normal    12    23     5    54
2     2 4.7.22   4000 normal     0     2     0     0
3     3 5.7.22  20000 normal     7     0     0     0

非常感谢TarJae。不幸的是,我的数据没有像“var1”“var2”等这样标记,而是有非常不同的名称。在“帮助”中,我找到了“contains”命令,并尝试使用您的代码,而不是“starts_with”。但是,然后我在第一个观察值处遇到错误,代码停止了。同样,这是因为我的某个变量的字符类型不是数字,因为错误提示说:“sum()中的错误,无效类型....” - Aisberg
在这里,我刚刚删除了字符串变量列。然后你的代码就可以使用“包含”而不是“以...开始”完美运行了。目前这解决了我的问题,因为对我来说字符串列不太重要,我已经将其删除了。但如果您也知道如何处理字符串列,我将非常感激。 - Aisberg
1
你可以使用summarise(across(c("colx", "coly", "colz"), ~sum(., na.rm = TRUE)))代替summarise(across(starts_with("Var"), ~sum(., na.rm = TRUE))) - TarJae

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接