如何按组对变量求和
Posted
技术标签:
【中文标题】如何按组对变量求和【英文标题】:How to sum a variable by groups 【发布时间】:2021-02-11 07:21:19 【问题描述】:所以,我有一个样本数据
structure(list(Conversation = c(1L, 1L, 2L, 2L, 3L, 3L, 1L, 1L,
2L, 2L, 3L, 3L), ID.Number = c("ID 11", "ID 11", "ID 11", "ID 11",
"ID 11", "ID 11", "ID 14", "ID 14", "ID 14", "ID 14", "ID 14",
"ID 14"), Swear.word = c(0L, 2L, 4L, 3L, 0L, 0L, 1L, 0L, 3L,
1L, 0L, 4L)), class = "data.frame", row.names = c(NA, -12L))
而且,我正在尝试得到一个看起来像这样的结果
structure(list(IDNumber = c(11L, 14L), Convo1 = 2:1, Convo2 = c(7L, 4L), Convo3 = c(0L, 4L)), class = "data.frame", row.names = c(NA, -2L))
因此,基本上,我试图查看每个参与者按会话类型 (convo#) 的脏话使用情况(单词使用总和)。
如何使用 R 来做到这一点?
谢谢!
【问题讨论】:
【参考方案1】:试试这个tidyverse
方法。我使用共享为A
的数据。您可以在一个代码镜头中使用pivot_wider()
以获得所需的结果。代码如下:
library(tidyverse)
#Code
New <- A %>% mutate(Conversation=paste0('Conv.',Conversation)) %>%
pivot_wider(names_from = Conversation,values_from=Swear.word,values_fn = sum)
输出:
# A tibble: 2 x 4
ID.Number Conv.1 Conv.2 Conv.3
<chr> <int> <int> <int>
1 ID 11 2 7 0
2 ID 14 1 4 4
最佳代码截图可以是(非常感谢@starja):
#Code 2
Newdf <- A %>% pivot_wider(names_from = Conversation,
values_from=Swear.word,
values_fn = sum,names_prefix='Conv.')
输出:
# A tibble: 2 x 4
ID.Number Conv.1 Conv.2 Conv.3
<chr> <int> <int> <int>
1 ID 11 2 7 0
2 ID 14 1 4 4
【讨论】:
智能使用values_fn
!要只使用pivot_wider
,您可以使用names_prefix
@starja 很好的建议,让我为你添加那篇文章!【参考方案2】:
这应该可以工作
library(tidverse)
df <- x %>%
group_by(ID.Number, Conversation) %>%
summarize(
total = sum(Swear.word, na.rm = TRUE)
) %>%
spread(Conversation, total) %>%
magrittr::set_colnames(c("IDNumber","Convo1","Convo2", "Convo3"))
df
【讨论】:
【参考方案3】:这是dplyr
、tidyr
和stringr
的方法:
library(dplyr)
library(tidyr)
library(stringr)
data %>%
mutate(ID.Number = as.integer(str_extract(ID.Number, "\\d+"))) %>%
group_by(ID.Number, Conversation) %>%
summarise(count = sum(Swear.word)) %>%
pivot_wider(
id_cols = ID.Number,
names_from = Conversation,
values_from = count,
names_prefix = "Convo"
) %>%
rename(IDNumber = ID.Number)
# A tibble: 2 x 4
# Groups: IDNumber [2]
IDNumber Convo1 Convo2 Convo3
<int> <int> <int> <int>
1 11 2 7 0
2 14 1 4 4
【讨论】:
【参考方案4】:我们可以从base R
使用xtabs
xtabs(Swear.word ~ ID.Number + Conversation, df1)
# Conversation
#ID.Number 1 2 3
# ID 11 2 7 0
# ID 14 1 4 4
或者使用来自data.table
的dcast
library(data.table)
dcast(setDT(df1), ID.Number ~ paste0('Conv.', Conversation),
value.var = 'Swear.word', sum)
# ID.Number Conv.1 Conv.2 Conv.3
#1: ID 11 2 7 0
#2: ID 14 1 4 4
【讨论】:
以上是关于如何按组对变量求和的主要内容,如果未能解决你的问题,请参考以下文章