首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从R数据中提取逗号分隔值

从R数据中提取逗号分隔值
EN

Stack Overflow用户
提问于 2020-04-06 05:39:46
回答 1查看 529关注 0票数 3

以下dataframe中的一个列具有逗号分隔值:

Dataframe1:

代码语言:javascript
复制
Id        date                   price     batch          resp
uv-1      2020-01-10 15:13:16    1000      Q              ES,RT,AL
uv-2      2020-01-11 17:13:16    5000      W              ES,AL
uv-3      2020-01-12 18:13:16    2000      E              ES,RT
uv-4      2020-01-13 12:13:16    3000      R              ES,RT
uv-5      2020-01-14 13:13:16    1600      T              RT,AL
uv-6      2020-01-15 13:13:16    1600      T              ES,AL
uv-7      2020-01-17 11:13:16    1300      Y              ES,RT,AL

我需要按月提取resp值,如下所示。

代码语言:javascript
复制
                   Jan-20
batch    ES        RT      AL      Total
Q        1         1       1       1
%        100%      100%    100%    14.29%
W        1         0       1       1
%        100%      0.00%    100%   14.29% 
E        1         1       0       1
%        100%      100%    0.00%   14.29%   
R        1         1       0       1
%        100%      100%    0.00%   14.29%
T        1         1       2       2
%        50%       50%     100%    28.57%
Y        1         1       1       1
%        100%      100%    100%    14.29%
Total    6         5       5       7
Total(%) 85.71%    71.43%  71.43%  100%   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-06 07:23:25

使用dplyr、tidyr和lubridate,我们可以创建两个汇总数据框架,一个用于批次,另一个用于总计,然后使用bind_rows组合它们。

代码语言:javascript
复制
library(lubridate)
library(dplyr)
library(tidyr)

现在创建两个数据框架。第一组在月份和批次,第二组仅在月份:

代码语言:javascript
复制
df_batch <- df %>%
  mutate(date = as.POSIXct(date), resp=strsplit(resp, ",")) %>%
  unnest(resp) %>%
  group_by(month=month(date), batch) %>%
  count(resp) %>%
  mutate(Total=max(n), p=100*n/Total) %>% 
  pivot_wider(names_from=resp, values_from=c(n,p), values_fill=list(n=0, p=0)) %>%
  ungroup() %>%
  mutate(p_Total=100*Total/sum(Total)) %>%
  select(month,batch,starts_with("n"),Total,starts_with("p"))

df_totals <- df %>% 
  mutate(date = as.POSIXct(date), resp=strsplit(resp, ",")) %>%
  group_by(month=month(date)) %>%
  mutate(Total=n()) %>%
  unnest(resp) %>%
  count(Total, resp) %>%
  mutate(p=100*n/Total) %>%
  pivot_wider(names_from=resp, values_from=c(n, p)) %>%
  mutate(batch="Total", p_Total=100)

bind_rows(df_batch, df_totals)

代码语言:javascript
复制
# A tibble: 7 x 10
  month batch  n_ES  n_RT  n_AL Total  p_ES  p_RT  p_AL p_Total
  <dbl> <chr> <int> <int> <int> <int> <dbl> <dbl> <dbl>   <dbl>
1     1 E         1     1     0     1 100   100     0      14.3
2     1 Q         1     1     1     1 100   100   100      14.3
3     1 R         1     1     0     1 100   100     0      14.3
4     1 T         1     1     2     2  50    50   100      28.6
5     1 W         1     0     1     1 100     0   100      14.3
6     1 Y         1     1     1     1 100   100   100      14.3
7     1 Total     6     5     5     7  85.7  71.4  71.4   100

它不完全是您提供的格式,但结果是完全相同的,它应该工作多个月。

数据

代码语言:javascript
复制
structure(list(Id = c("uv-1", "uv-2", "uv-3", "uv-4", "uv-5", 
"uv-6", "uv-7"), date = c("2020-01-10 15:13:16", "2020-01-11 17:13:16", 
"2020-01-12 18:13:16", "2020-01-13 12:13:16", "2020-01-14 13:13:16", 
"2020-01-15 13:13:16", "2020-01-17 11:13:16"), price = c(1000L, 
5000L, 2000L, 3000L, 1600L, 1600L, 1300L), batch = c("Q", "W", 
"E", "R", "T", "T", "Y"), resp = c("ES,RT,AL", "ES,AL", "ES,RT", 
"ES,RT", "RT,AL", "ES,AL", "ES,RT,AL")), class = "data.frame", row.names = c(NA, 
-7L))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61053561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档