R 按组计算列中的正负值

R 按组计算列中的正负值,r,dataframe,dplyr,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.083797

我想创建两个变量,通过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
我认为类似的方法也会奏效:

df<-df%>% group_by(id) %>%  mutate(pos= nrow(ff>0)) %>% ungroup()
df%group\u by(id)%%>%mutate(pos=nrow(ff>0))%%>%ungroup()
任何帮助都会很好,谢谢。

您需要
sum()

df%>%group\u by(id)%>%
突变(pos=总和(ff>0),
neg=求和(ff以获得有趣(和快速)的解决方案
数据。表也可用于:

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

以下是一个答案,其中添加了问题的
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))
df%group\u by(id)%%>%
突变(pos=总和(ff>0),neg=总和(ff%
分组依据(id)%>%
突变(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
>头部(df,20)
来源:本地数据帧[20 x 5]
组别:id[2]
id ff pos neg any_neg
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

您是否知道创建第三个变量(0/1)的方法,该变量表示如果ID中的任何值为负值,则将其设置为1,否则为0?类似于group_by语句中的ifelse?@user63230可能与
group_by(ID)%%>%的行类似的内容发生变化(neg=ifelse(ID<0,1,0))
?@Megatron谢谢,不太准确,但我已经解决了。只需要“any”,所以代码是
df%group\u by(id)%%>%mutate(neg=ifelse(any(ff<0),1,0))
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