【问题标题】:Filter values based on row conditions根据行条件过滤值
【发布时间】:2018-11-25 20:17:57
【问题描述】:

我正在处理一个我不知道如何解决的相对简单的问题。假设我有以下数据框:

Book  Word  Rel.Freq
   A   art      0.56
   A   car       0.4
   B   car      0.58
   B   dog      0.32
   C   art       0.5
   C   car      0.48
   C   dog      0.35

所以,我想要一个数据框,其值与列字相同。我需要一些函数来比较单词中的 A、B 和 C 值并仅提取共享的值,即仅在所有“书籍”中重复的值。我还需要一种方法来总结 Rel。频率。值并根据书中变量的数量获得平均值。我想要一个看起来像这样的数据框:

word  Mean.Rel.Freq
 car           0.48

【问题讨论】:

  • "只有那些在所有 "books" 中重复的内容" 但是您预期输出中的 art A 之间共享,BC(而car 共享但不显示)。我错过了什么?
  • 欢迎来到 SO。在这里展示你尝试过的东西被认为是礼貌的......另外,你可能想澄清你的问题,因为它并不完全清楚。
  • "art" 并不是在所有书中都重复出现(仅在 A 和 C 中),0.5 和 0.56 的平均值(或总和)肯定不是 0.48。
  • 试试df1 %>% group_by(Word) %>% filter(n_distinct(Book) == n_distinct(df1$Book)) %>% summarise(Mean.Rel.Freq = mean(Rel.Freq))

标签: r dataframe filter subset


【解决方案1】:

在按'Word'分组后,我们filter那些'Word'的'Book'的不同元素的数量等于整个数据集中'Book'的不同元素的数量和summarise'Rel。 Freq' 通过获取它的mean

library(tidyverse)
df1 %>% 
  group_by(Word) %>% 
  filter(n_distinct(Book) == n_distinct(.$Book)) %>% 
  summarise(Mean.Rel.Freq = mean(Rel.Freq))
# A tibble: 1 x 2
#   Word  Mean.Rel.Freq
#   <chr>         <dbl>
#1 car           0.487

【讨论】:

    【解决方案2】:

    这是使用tidyverse 软件包套件完成此任务的一种方法。

    library(tidyverse)
    # read in example data
    df <- read_table("Book  Word  Rel.Freq
       A   art      0.56
        A   car       0.4
        B   car      0.58
        B   dog      0.32
        C   art       0.5
        C   car      0.48
        C   dog      0.35")
    output <- df %>% 
      group_by(Word) %>% 
      summarize(
        n_books = n(),
        Mean.Rel.Freq = mean(Rel.Freq)
      ) 
    # remove (if desired) the words with too-few books.
    output <- output %>%
      filter(n_books < 3) # replace 3 with total number of books
    

    【讨论】:

      【解决方案3】:

      使用aggregateReduce + intersect 找到一致的Words:

      aggregate(
          Rel.Freq ~ Word, data=dat, FUN=mean,
          subset = Word %in% Reduce(intersect, split(Word, Book))
      )
      
      #  Word  Rel.Freq
      #1  car 0.4866667
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 2013-09-06
        相关资源
        最近更新 更多