【问题标题】:How can I match two sets of factor levels in a new data frame?如何在新数据框中匹配两组因子水平?
【发布时间】:2019-02-08 11:45:47
【问题描述】:

我有一个大数据框,我想导出一个新的数据框,其中包含基于 id 列的第一个汇总统计信息。

library(tidyverse)
set.seed(123) 
id = rep(c(letters[1:5]), 2)
species = c("dog","dog","cat","cat","bird","bird","cat","cat","bee","bee")
study = rep("UK",10)
freq = rpois(10, lambda=12)
df1 <- data.frame(id,species, freq,study)
df1$id<-sort(df1$id)
df1

df2 <- df1 %>% group_by(id) %>%
  summarise(meanFreq= mean(freq),minFreq=min(freq))
df2

我想将物种名称保留在带有摘要统计信息的新数据框中。但是如果我按 id 合并,我会得到多余的行。我应该每个 id 只有一行,但要附加物种名称。

df3<-merge(df2,df1,by = "id") 

这应该是它的样子,但我的真实数据比这里整齐的设置更混乱:

df4 = df3[seq(1, nrow(df3), 2), ]
df4

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    从汇总输出 ('df2') 中,我们可以加入所选原始数据列的 distinct

    library(dplyr)
    df2 %>% 
        left_join(df1 %>% 
                    distinct(id, species, study), by = 'id')
    # A tibble: 5 x 5
    #  id    meanFreq minFreq species study
    #  <fct>    <dbl>   <dbl> <fct>   <fct>
    #1 a         10.5      10 dog     UK   
    #2 b         14.5      12 cat     UK   
    #3 c         14.5      12 bird    UK   
    #4 d         10         7 cat     UK   
    #5 e         11         6 bee     UK   
    

    或者使用与base R相同的逻辑

    merge(df2,unique(df1[c(1:2, 4)]),by = "id", all.x = TRUE)
    

    【讨论】:

      【解决方案2】:

      mutate 后跟 distinct 的时间:

      df1 %>% group_by(id) %>%
        mutate(meanFreq = mean(freq), minFreq = min(freq)) %>%
        distinct(id, .keep_all = T)
      

      现在实际上有两种可能性:idspecies 在您的df 中基本相同,一个只是另一个的标签,或者相同的 id 可以有多个物种。

      如果是后者,您需要将最后一行替换为distinct(id, species, .keep_all = T)

      这会让你:

      # A tibble: 5 x 6
      # Groups:   id [5]
        id    species  freq study meanFreq minFreq
        <fct> <fct>   <int> <fct>    <dbl>   <dbl>
      1 a     dog        10 UK        10.5      10
      2 b     cat        17 UK        14.5      12
      3 c     bird       12 UK        14.5      12
      4 d     cat        13 UK        10         7
      5 e     bee         6 UK        11         6
      

      如果您的唯一目标是保留 species 并且它们确实与 id 相同,您也可以将其包含在 group_by 中:

      df1 %>% group_by(id, species) %>%
            summarise(meanFreq = mean(freq), minFreq = min(freq))
      

      这将删除 studyfreq - 如果您需要保留它们,您可以再次将 summarise 替换为 mutate,然后将 distinct 替换为 .keep_all = T 参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 2017-02-19
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 2017-07-18
        相关资源
        最近更新 更多