根据行条件过滤值

时间:2018-06-16 04:04:08

标签: r dataframe filter subset

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

按“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 :(得分:2)

使用aggregateReduce + intersect的基础R版本来查找一致的Word

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

#  Word  Rel.Freq
#1  car 0.4866667