当 R 中缺少行时在数据框中搜索时设置合成 0 值

Set a synthetic 0 value while searching in dataframe when row is missing in R

我有一个 R 查询,我无法理解。这是 table 我有:

House ownername type no. of babies
1 Pete cat 1
1 Tom dog 3
2 Chrissa cat 4
2 Mary dog 2
3 Pete cat 6
3 Pete dog 3
4 Jamie cat 2
all _ cat 13
all _ dog 8

我们可以忽略ownername,但是Housetypeno. of babies很重要。本质上,每个房子都有一只猫和一只狗及其相应数量的后代。 请注意,House 4 缺少一排狗,因为它没有狗,但为了这个问题,我希望它在那里

我尝试了以下代码:

df %>% select(House, type, no. of babies)

当然,这摆脱了 ownername,一切都保持不变,但我希望这是以下输出:

House type no. of babies
1 cat 1
1 dog 3
2 cat 4
2 dog 2
3 cat 6
3 dog 3
4 cat 2
4 dog 0
all cat 13
all dog 8

我想展示 4 号屋的那一排狗,即使它不是。婴儿行不存在。 我想弄清楚如何实现它。请注意,我不想在数据框中综合创建一行,在 House 4 中添加一排狗(我不想对其进行硬编码,而且所有者名称不一致)。我希望通过我在上面复制的 select 函数来实现这一点,并进行某种额外的修改,但我在这方面遇到了很多麻烦。

我对我正在尝试做的事情的最佳解释是创建一个查看输出的函数 table,遍历 1-4 号房屋(以及所有)以确保每个房屋都具有 animal1 和animal2 如果他们不这样做,他们会添加一个并且没有。婴儿输出为 0。此外,如果无需硬编码 'cat' 和 'dog' 即可完成此操作(例如,后面的数据帧中有相同格式的马和老鼠),那将真的很有帮助。如果没有,那完全没问题。

如果您能找到任何解决方案,请告诉我,我将不胜感激。

您需要包 tidyr 中的 complete() 函数,它会填充隐式缺失值。

代码

library(dplyr)
library(tidyr)

df %>% 
  select(House, type, `no. of babies`) %>% 
  complete(House, type, fill = list(`no. of babies` = 0))

# A tibble: 10 × 3
   House type  `no. of babies`
   <chr> <chr>           <int>
 1 1     cat                 1
 2 1     dog                 3
 3 2     cat                 4
 4 2     dog                 2
 5 3     cat                 6
 6 3     dog                 3
 7 4     cat                 2
 8 4     dog                 0
 9 all   cat                13
10 all   dog                 8

输入数据

df <- read.table(header = T, check.names = F, sep = "\t", text = "
House   ownername   type    no. of babies
1   Pete    cat 1
1   Tom dog 3
2   Chrissa cat 4
2   Mary    dog 2
3   Pete    cat 6
3   Pete    dog 3
4   Jamie   cat 2
all _   cat 13
all _   dog 8")