【问题标题】:Make a new variable based on conditions and matching with existing ones根据条件创建新变量并与现有变量匹配
【发布时间】:2021-01-04 18:55:09
【问题描述】:

我的数据集包含以下变量:日期、时间、物种、饮食

'diet' 仅在每个 'day' 的某些 'time' 记录,因此,我希望创建一个新变量 'daily.diet',其中每个物种每天的值为 'diet'(即daily.diet = 日期和物种匹配时的饮食)。

我制作了一个示例数据框来使用:

df <- data.frame(day = c(1,1,1,2,2,2,3,3,3), 
                  time = c(5,6,7,9,5,7,9,5,9), 
  species = c('a','b','c','c','c','b','a','a','b'),
  diet=c('na', 'na', 'green', 'na', 'na', 'blue', 'na', 'na', 'na'))

【问题讨论】:

    标签: r dplyr match


    【解决方案1】:

    同意@Michael Dewar 的观点,您可能需要考虑使用NA 处理缺失数据,除非您的编码方案/数据收集有充分的理由引导您。

    同样使用tidyverse,您可以从tidyr 中的fill 填写缺少的diet 值,在dayspecies 相同的行中。

    例如:

    library(dplyr)
    library(tidyr)
    
    df$diet <- replace(df$diet, df$diet == 'na', NA)
    
    df %>%
      group_by(day, species) %>%
      fill(diet, .direction = "downup")
    

    示例数据不包括可能发生这种情况的实例。下面是一个带有不同数据的示例来演示,并创建一个新列daily.diet

    df %>%
      group_by(day, species) %>%
      mutate(daily.diet = diet) %>%
      fill(daily.diet, .direction = "downup")
    

    输出

        day  time species diet  daily.diet
      <dbl> <dbl> <chr>   <chr> <chr>     
    1     1     5 a       NA    NA        
    2     1     6 b       NA    NA        
    3     1     7 c       green green     
    4     1     9 c       NA    green     
    5     2     5 c       NA    NA        
    6     2     7 b       blue  blue      
    7     3     9 a       red   red       
    8     3     5 a       NA    red       
    9     3     9 b       NA    NA 
    

    数据

    df <- structure(list(day = c(1, 1, 1, 1, 2, 2, 3, 3, 3), time = c(5, 
    6, 7, 9, 5, 7, 9, 5, 9), species = c("a", "b", "c", "c", "c", 
    "b", "a", "a", "b"), diet = c(NA, NA, "green", NA, NA, "blue", 
    "red", NA, NA)), row.names = c(NA, -9L), class = "data.frame")
    

    【讨论】:

      【解决方案2】:

      虽然我不确定你在寻找什么,但我猜你想要类似的东西

      library(tidyverse)
      new_df <- df %>% 
          group_by(species, day) %>% 
          filter(n_distinct(diet) == 1) %>% 
          ungroup %>% 
          distinct(day, species, daily.diet = diet)
      

      您可以使用df %&gt;% left_join(new_df) 将其加入到您的原始数据中。

      另外,您可能希望使用NA 而不是'na'。后者只是一个字符串,而前者是R的缺失值。

      【讨论】:

      • 这个解决方案很有意义,但是当我运行它时,输出是:# A tibble: 0 x 3 # ... with 3 variables: date , species , Rdo
      • 我的代码假定您已经使用问题中的命令创建了df。你的df 有没有可能是别的东西?
      猜你喜欢
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多