在data.frame中显示按组计算的条件行数

时间:2016-07-29 14:36:53

标签: r dplyr

我正在努力在data.frame中创建一个新变量。我为问题标题道歉,可能不太清楚。我有一个看起来像这样的数据库:

obs    year    type
 1     2015     A
 2     2015     A
 3     2015     B
 4     2014     A
 5     2014     B

我想在当前data.frame中添加一列(freq2015),该列提供2015年类型的行数,并且只要类型相同,就会报告结果,而不考虑所考虑的年份。这是我要找的输出:

obs    year    type    freq2015
 1     2015     A         2      (there are 2 obs. of type A in 2015)
 2     2015     A         2      (there are 2 obs. of type A in 2015)
 3     2015     B         1      (there is 1 obs. of type B in 2015)
 4     2014     A         2      (there are 2 obs. of type A in 2015)
 5     2014     B         1      (there are 1 obs. of type B in 2015)

我知道如何使用data.frame按年份按类型添加dplyr行数:

data <- data %>% 
     group_by(year, type) %>% 
     mutate(freq = n()) 

但是,对于年份==“2014”,添加的列将按种族而不是2015年显示2014年的行数。

我知道如何通过2015年种族隔离新行data.frame

data2015 <- dat[dat$year==2015,] %>% 
         group_by(type) %>% 
         mutate(freq2015 = n())

但是我不知道如何为整个data.frame添加一个列(按比例划分2015年的行数),条件是类型相同(如示例所示)。我正在寻找一种可以阻止我明确使用“类型”变量模态的解决方案。也就是说,我不想使用代码告诉R:如果键入== A,请执行此操作,否则执行此操作。这种限制的原因是我的类型太多了。

有什么想法吗?提前谢谢。

4 个答案:

答案 0 :(得分:2)

如果group_by仅使用type,则可以在year == 2015时对行进行求和。

data %>%
    group_by(type) %>%
    mutate(freq2015 = sum(year == 2015))

Source: local data frame [5 x 4]
Groups: type [2]

    obs  year   type freq2015
  <int> <int> <fctr>    <int>
1     1  2015      A        2
2     2  2015      A        2
3     3  2015      B        1
4     4  2014      A        2
5     5  2014      B        1

答案 1 :(得分:0)

使用我们可以做的数据表:

setDT(df)
setkey(df,type)
df[ df[ year==2015, .(freq2015=.N), by = type]]

结果:

     obs year type freq2015
1:   1 2015    A        2
2:   2 2015    A        2
3:   4 2014    A        2
4:   3 2015    B        1
5:   5 2014    B        1

答案 2 :(得分:0)

您可以使用left_join(),如下所示:

temp <- data %>% 
    filter(year==2015) %>%
    group_by(type) %>% 
    summarize(freq = n())#  %>%
data <- data %>% left_join(temp, "type")

答案 3 :(得分:0)

我们可以使用base R使用ave(没有任何外部软件包)执行此操作,并且速度也相当快。

df1$freq2015 <- with(df1, ave(year == 2015, type, FUN = sum))
df1$freq2015
#[1] 2 2 1 2 1