我如何给R中没有对应日期的每个菌种添加零或NA?[duplicate]

plupiseo  于 2023-02-20  发布在  其他
关注(0)|答案(2)|浏览(121)
    • 此问题在此处已有答案**:

How to complete missing factor levels in data frame?(1个答案)
Using rbind to add 0 values during a loop(3个答案)
20小时前关门了。
我有一个数据库,看起来像这样(虽然它有更多的物种和日期):
| 日期|种属|计数|
| - ------|- ------|- ------|
| 二○二二年六月一日|AMAV无人机|五十|
| 二○二二年六月五日|AMAV无人机|二十个|
| 二○二二年六月七日|SESA公司|十个|
| 二○二二年六月七日|AMAV无人机|八个|
我希望每个日期包括计数为0的每个物种,如果该日期最初没有列出任何物种。当没有列出任何物种时,这只是意味着没有检测到该物种,因此计数应为0。
对于这个例子,我希望它看起来像:
| 日期|种属|计数|
| - ------|- ------|- ------|
| 二○二二年六月一日|AMAV无人机|五十|
| 二○二二年六月一日|SESA公司|无|
| 二○二二年六月五日|AMAV无人机|二十个|
| 二○二二年六月五日|SESA公司|无|
| 二○二二年六月七日|SESA公司|十个|
| 二○二二年六月七日|AMAV无人机|八个|
所以我希望每个日期都能列出我的物种。
我想知道是否有人知道一种方法来完成这一点在R。我真的不知道如何解决这个问题,所以将感谢任何提示!

piwo6bdm

piwo6bdm1#

大多数情况下,这是填充缺少日期的系列的经典问题。创建数据,将所有值扩展到所有日期,并将左外联接到此数据。

# All combinations
full <- expand.grid(Date = unique(df$Date), Species = unique(df$Species))
# Filled new table
merge(full, df, by = c('Date', 'Species'), all.x = TRUE)
#        Date Species Count
#1 2022/06/01    AMAV    50
#2 2022/06/01    SESA    NA
#3 2022/06/05    AMAV    20
#4 2022/06/05    SESA    NA
#5 2022/06/07    AMAV     8
#6 2022/06/07    SESA    10

之后,如果愿意,可以使用标准df$Count[is.na(df$Count)] <- 0将NA值替换为零。

cgh8pdjw

cgh8pdjw2#

tidyverse解决方案:
这里我们首先创建一个helper列x,通过透视得到shape中的列,然后用0替换x,并使用arrange将行放置到分组和切片的位置:

library(dplyr)
library(tidyr)

df %>% 
  mutate(x = ifelse(Species=="AMAV", "SESA", "AMAV")) %>% 
  pivot_longer(c(Species, x),
               names_to="name", 
               values_to = "Species") %>% 
  mutate(Count = ifelse(name=="x", 0, Count), .keep="unused") %>% 
  arrange(Date, -Count) %>%
  group_by(Date) %>% 
  slice(1:2) %>% 
  ungroup()
Date       Count Species
  <chr>      <dbl> <chr>  
1 2022/06/01    50 AMAV   
2 2022/06/01     0 SESA   
3 2022/06/05    20 AMAV   
4 2022/06/05     0 SESA   
5 2022/06/07    10 SESA   
6 2022/06/07     8 AMAV

相关问题