dplyr / tidyr - 根据条件汇总数据
dplyr / tidyr - Summarise data with conditions
问题
我正在尝试使用 dyplr 和 tidyr 来实现输出 table(就像我认为的意外事件 table),它将这些数据汇总为频率(例如,负面、中性的标题、描述和正文的计数和正数)。我尝试了很多不同的方法,我能找到的最接近的例子是 。但这不合适,相当。
示例数据
数据看起来有点像...
df <- data.frame( "story_title"=c(0.0,0.0,0.0,-1.0,1.0),
"story_description"=c(-0.3,-0.3,-0.3,0.5,0.3),
"story_body"=c(-0.3,0.2,0.4,0.2,0))
期望的输出
希望输出看起来有点像这样,显示每个故事部分的摘要频率...
Negative Neutral Positive
story_title 1 3 1
story_description 3 0 2
story_body 1 1 3
(已编辑 story_body 的总数 - 感谢 Akrun)
尝试的方法
如果我是对的,第一步将是使用 gather
重塑数据,因此...
df <- df %>% gather(type,score,starts_with("story"))
> df
type score
1 story_title 0.0
2 story_title 0.0
3 story_title 0.0
4 story_title -1.0
5 story_title 1.0
6 story_description -0.3
7 story_description -0.3
8 story_description -0.3
9 story_description 0.5
10 story_description 0.3
11 story_body -0.3
12 story_body 0.2
13 story_body 0.4
14 story_body 0.2
15 story_body 0.0
从这里我认为它是 group_by 和总结的组合,我已经尝试过...
df %>% group_by(sentiment) %>%
summarise(Negative = count("sentiment_title"<0),
Neutral = count("sentiment_title"=0),
Positive = count("sentiment_title">0)
)
显然这没有用。
任何人都可以帮助 dplyr/tidyr 解决方案(基础 table 答案也可以用作示例)?
试试
library(dplyr)
library(tidyr)
gather(df) %>%
group_by(key,value= sign(value))%>%
tally() %>%
mutate(ind= factor(value, levels=c(-1,0,1),
labels=c('Negative', 'Neutral', 'Positive'))) %>%
select(-value) %>%
spread(ind, n, fill=0)
尝试使用 cut
重新标记这三个类别。那么这只是用 gather
融化数据并用 dcast
重塑 'wide' 的问题。
library(tidyr)
library(reshape2)
df[] <- lapply(df, function(x) {cut(x, c(-Inf,-1e-4,0,Inf), c("Negative", "Neutral", "Positive"))})
dcast(gather(df), key~value)
# key Negative Neutral Positive
#1 story_title 1 3 1
#2 story_description 3 0 2
#3 story_body 1 1 3
你为什么不直接使用原生 R 的 xtabs?
根据您的代码继续:
>df <- df %>% gather(type,score,starts_with("story"))
>df$movement<-ifelse(df$score ==0 ,"Neutral",ifelse(df$score < 0 ,"Negative","Positive"))
>xtabs(~df$type+df$movement)
df$movement
df$type Negative Neutral Positive
story_title 1 3 1
story_description 3 0 2
story_body 1 1 3
问题
我正在尝试使用 dyplr 和 tidyr 来实现输出 table(就像我认为的意外事件 table),它将这些数据汇总为频率(例如,负面、中性的标题、描述和正文的计数和正数)。我尝试了很多不同的方法,我能找到的最接近的例子是
示例数据 数据看起来有点像...
df <- data.frame( "story_title"=c(0.0,0.0,0.0,-1.0,1.0),
"story_description"=c(-0.3,-0.3,-0.3,0.5,0.3),
"story_body"=c(-0.3,0.2,0.4,0.2,0))
期望的输出 希望输出看起来有点像这样,显示每个故事部分的摘要频率...
Negative Neutral Positive
story_title 1 3 1
story_description 3 0 2
story_body 1 1 3
(已编辑 story_body 的总数 - 感谢 Akrun)
尝试的方法
如果我是对的,第一步将是使用 gather
重塑数据,因此...
df <- df %>% gather(type,score,starts_with("story"))
> df
type score
1 story_title 0.0
2 story_title 0.0
3 story_title 0.0
4 story_title -1.0
5 story_title 1.0
6 story_description -0.3
7 story_description -0.3
8 story_description -0.3
9 story_description 0.5
10 story_description 0.3
11 story_body -0.3
12 story_body 0.2
13 story_body 0.4
14 story_body 0.2
15 story_body 0.0
从这里我认为它是 group_by 和总结的组合,我已经尝试过...
df %>% group_by(sentiment) %>%
summarise(Negative = count("sentiment_title"<0),
Neutral = count("sentiment_title"=0),
Positive = count("sentiment_title">0)
)
显然这没有用。
任何人都可以帮助 dplyr/tidyr 解决方案(基础 table 答案也可以用作示例)?
试试
library(dplyr)
library(tidyr)
gather(df) %>%
group_by(key,value= sign(value))%>%
tally() %>%
mutate(ind= factor(value, levels=c(-1,0,1),
labels=c('Negative', 'Neutral', 'Positive'))) %>%
select(-value) %>%
spread(ind, n, fill=0)
尝试使用 cut
重新标记这三个类别。那么这只是用 gather
融化数据并用 dcast
重塑 'wide' 的问题。
library(tidyr)
library(reshape2)
df[] <- lapply(df, function(x) {cut(x, c(-Inf,-1e-4,0,Inf), c("Negative", "Neutral", "Positive"))})
dcast(gather(df), key~value)
# key Negative Neutral Positive
#1 story_title 1 3 1
#2 story_description 3 0 2
#3 story_body 1 1 3
你为什么不直接使用原生 R 的 xtabs?
根据您的代码继续:
>df <- df %>% gather(type,score,starts_with("story"))
>df$movement<-ifelse(df$score ==0 ,"Neutral",ifelse(df$score < 0 ,"Negative","Positive"))
>xtabs(~df$type+df$movement)
df$movement
df$type Negative Neutral Positive
story_title 1 3 1
story_description 3 0 2
story_body 1 1 3