R:根据两个条件创建一个变量

时间:2019-12-05 18:03:22

标签: r

数据如下(x和dummy是引用“ id”的变量):

   tweet_id <- c(1,2,6,3,4,5,1,2)
    X <- c(0.12426699, 0.12426699, 0.08685890, 0.08685890, 0.08685890, 0.28853901, 0.09102392, 0.09102392)
    id <- c(1,1,2,2,2,3,4,4)
    dummy <- c(1,1,1,1,1,0,0,0)        
    dt <- as.data.frame(cbind(id, X , tweet_id, dummy))

我正在寻找一个函数来创建具有以下值的列:

第1行: 计算tweet_id = 1的所有X的数字总和,其中dummy = 1

第2行: 计算tweet_id = 2的所有X的数字总和,其中dummy = 1

第3行: 计算tweet_id = 6的所有X的数字总和,其中dummy = 1

第4行: 计算tweet_id = 3(假人= 1)的所有X的数字总和

....

第7行: 计算tweet_id = 1的所有X的数字总和,其中dummy = 0

第8行: 计算tweet_id = 2的所有X的总数,其中dummy = 0

因此,基本上,我想基于id特性'dummy'的开放条件来计算与原始tweet id相关的内容

我希望这很清楚

3 个答案:

答案 0 :(得分:1)

您可以使用group_by库中的dplyr函数:

library(dplyr)
dt %>% group_by(tweet_id, dummy) %>% summarise(suma = sum(X))

输出:

# A tibble: 8 x 3
# Groups:   tweet_id [6]
  tweet_id dummy   suma
     <dbl> <dbl>  <dbl>
1        1     0 0.0910
2        1     1 0.124 
3        2     0 0.0910
4        2     1 0.124 
5        3     1 0.0869
6        4     1 0.0869
7        5     0 0.289 
8        6     1 0.0869

祝你好运!

答案 1 :(得分:1)

我认为您只是在按情况描述一个小组?

这是dplyr解决方案:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

tweet_id <- c(1,2,6,3,4,5,1,2)
X <- c(0.12426699, 0.12426699, 0.08685890, 0.08685890, 0.08685890, 0.28853901, 0.09102392, 0.09102392)
id <- c(1,1,2,2,2,3,4,4)
dummy <- c(1,1,1,1,1,0,0,0)        
dt <- as.data.frame(cbind(id, X , tweet_id, dummy))


dt_new <- dt %>% 
  group_by(tweet_id, dummy) %>% 
  summarise(X_sum = sum(X))

或将其添加到现有data.frame:

dt <- dt %>% 
  group_by(tweet_id, dummy) %>% 
  mutate(X_sum = sum(X))
#> # A tibble: 8 x 5
#> # Groups:   tweet_id, dummy [8]
#>      id      X tweet_id dummy  X_sum
#>   <dbl>  <dbl>    <dbl> <dbl>  <dbl>
#> 1     1 0.124         1     1 0.124 
#> 2     1 0.124         2     1 0.124 
#> 3     2 0.0869        6     1 0.0869
#> 4     2 0.0869        3     1 0.0869
#> 5     2 0.0869        4     1 0.0869
#> 6     3 0.289         5     0 0.289 
#> 7     4 0.0910        1     0 0.0910
#> 8     4 0.0910        2     0 0.0910

reprex package(v0.3.0)于2019-12-05创建

答案 2 :(得分:1)

带有base R

的选项
aggregate(X ~ tweet_id + dummy, dt, FUN = sum)