逐列计数正负值

时间:2016-11-14 18:19:41

标签: r dataframe dplyr

我想创建两个变量,根据id给出正值和负值的总数,希望使用dplyr

示例数据:

library(dplyr)    
set.seed(42)
    df <- data.frame (id=rep(1:10,each=10),
                      ff=rnorm(100, 0,14 ))
> head(df,20)
   id          ff
1   1  19.1934183
2   1  -7.9057744
3   1   5.0837978
4   1   8.8600765
5   1   5.6597565
6   1  -1.4857432
7   1  21.1613080
8   1  -1.3252265
9   1  28.2579320
10  1  -0.8779974
11  2  18.2681752
12  2  32.0130355
13  2 -19.4440498
14  2  -3.9030427
15  2  -1.8664987
16  2   8.9033056
17  2  -3.9795409
18  2 -37.1903759
19  2 -34.1665370
20  2  18.4815868

结果数据集应如下所示:

> head(df,20)
   id          ff pos neg
1   1  19.1934183   6   4
2   1  -7.9057744   6   4
3   1   5.0837978   6   4
4   1   8.8600765   6   4
5   1   5.6597565   6   4
6   1  -1.4857432   6   4
7   1  21.1613080   6   4
8   1  -1.3252265   6   4
9   1  28.2579320   6   4
10  1  -0.8779974   6   4
11  2  18.2681752   4   6
12  2  32.0130355   4   6
13  2 -19.4440498   4   6
14  2  -3.9030427   4   6
15  2  -1.8664987   4   6
16  2   8.9033056   4   6
17  2  -3.9795409   4   6
18  2 -37.1903759   4   6
19  2 -34.1665370   4   6
20  2  18.4815868   4   6

我认为类似的东西会起作用:

df<-df%>% group_by(id) %>%  mutate(pos= nrow(ff>0)) %>% ungroup()

任何帮助都会很棒,谢谢。

3 个答案:

答案 0 :(得分:3)

您需要sum()

df %>% group_by(id) %>%  
  mutate(pos = sum(ff>0),
         neg = sum(ff<0))

答案 1 :(得分:2)

对于有趣(和快速)的解决方案data.table也可以使用:

library(data.table)
setDT(df)    
df[, ":="(pos = sum(ff > 0), neg = sum(ff < 0)), by = id]

答案 2 :(得分:1)

以下是添加问题ifelse部分的答案:

df <- df %>% group_by(id) %>%  
  mutate(pos = sum(ff>0), neg = sum(ff<0)) %>%
  group_by(id) %>%
  mutate(any_neg=ifelse(any(ff < 0), 1, 0))

输出:

> head(df, 20)
Source: local data frame [20 x 5]
Groups: id [2]

      id          ff   pos   neg any_neg
   <int>       <dbl> <int> <int>   <dbl>
1      1  19.1934183     6     4       1
2      1  -7.9057744     6     4       1
3      1   5.0837978     6     4       1
4      1   8.8600765     6     4       1
5      1   5.6597565     6     4       1
6      1  -1.4857432     6     4       1
7      1  21.1613080     6     4       1
8      1  -1.3252265     6     4       1
9      1  28.2579320     6     4       1
10     1  -0.8779974     6     4       1
11     2  18.2681752     4     6       1
12     2  32.0130355     4     6       1
13     2 -19.4440498     4     6       1
14     2  -3.9030427     4     6       1
15     2  -1.8664987     4     6       1
16     2   8.9033056     4     6       1
17     2  -3.9795409     4     6       1
18     2 -37.1903759     4     6       1
19     2 -34.1665370     4     6       1
20     2  18.4815868     4     6       1