R 按组计算列中的正负值
我想创建两个变量,通过id给出正值和负值的总数,希望使用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
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