按组计算列中的正负值

Posted

技术标签:

【中文标题】按组计算列中的正负值【英文标题】:count positive negative values in column by group 【发布时间】:2017-03-28 11:25:51 【问题描述】:

我想创建两个变量,通过 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()

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

【问题讨论】:

【参考方案1】:

你需要sum():

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

【讨论】:

您是否知道一种方法来创建第三个变量 (0/1),如果 ID 中的任何值是负数,则设置为 1,否则设置为 0? group_by 语句中的 ifelse 之类的东西? @user63230 可能类似于group_by(id) %&gt;% mutate(neg=ifelse(id &lt; 0, 1, 0))? @Megatron 谢谢,不完全是,但我解决了。只想要“任何”,所以代码是df&lt;-df %&gt;% group_by(id) %&gt;% mutate(neg=ifelse(any(ff &lt; 0), 1, 0))【参考方案2】:

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

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

【讨论】:

【参考方案3】:

这是在您的问题中添加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

【讨论】:

以上是关于按组计算列中的正负值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 的另一列中的字符串值中从数据框中的一列中搜索字符串?

R 提取最常见的单词)/ n 克在列中按组

从数据框列中的字符串值中删除字符

从数据库列和 C# 中的 textBox 值中扣除值,扣除后的值必须存储在新列中

Libre Office 电子表格 - 如何在列中的多个重复值中仅保留一个值?

如何将逗号添加到数据框中的现有值中?熊猫