数据如下(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相关的内容
我希望这很清楚
答案 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)