如何为唯一ID转置字符数据

时间:2019-01-28 18:57:00

标签: r transpose

我正在尝试执行求和功能以计算唯一ID的互动次数

所以我有这样的东西:

Client ID    
JOE12_EMI    
ABC12_CANC
ABC12_EMI
ABC12_RENE

以此类推...

它旁边还有一列,用于计算每个唯一ID重复多少次。

Frequency
1
2
2
1

有没有办法让我为每个ID汇总所有活动类型(EMI,TELI,PFL),然后将其放入新列?

我试图通过将实际ID与活动类型分开来转置数据,但这不会返回总和,谢谢您的帮助。我不确定这是最好的方法,还是将数据转换为宽格式,然后再执行另一个求和函数,但我不确定该怎么做。

separate(frequency, id, c("id", "act_code") )
nd <- melt(frequency, id=(c("id")))

2 个答案:

答案 0 :(得分:0)

您处在正确的轨道上;我认为您唯一需要的就是group_by。像这样:

library(dplyr)
library(tidyr)

df = data.frame(ClientID = c("JOE12_EMI",
                             "ABC12_CANC",
                             "ABC12_EMI",
                             "ABC12_RENE"))

df %>%
  separate(ClientID, into = c("id", "act_code"), sep = "_") %>%
  group_by(id) %>%
  mutate(frequency = n()) %>%
  ungroup() %>%
  group_by(id, act_code) %>%
  mutate(act_frequency = n()) %>%
  ungroup() %>%
  spread(act_code, act_frequency)

(这将按用户和活动类型分别进行总和;可以在用户进行数据透视后计算总和,但这种方式对我来说更容易阅读。)

答案 1 :(得分:0)

尝试一下:

library(dplyr)
data=data.frame(Client_ID= c("JOE12_EMI",
                             "ABC12_CANC",
                             "ABC12_EMI",
                             "ABC12_RENE"), 
                frequency= c(1,2,2,1))

client_and_id <- as.data.frame(do.call(rbind, strsplit(as.character(data$Client_ID), "_")))
names(client_and_id) <- c("client", "id")

data <-  cbind(data, client_and_id)

data_sum <- data %>% group_by(id) %>% mutate(sum_freq = sum(frequency))

输出

> data_sum
# A tibble: 4 x 5
# Groups:   id [3]
  Client_ID  frequency client id    sum_freq
  <fct>          <dbl> <fct>  <fct>    <dbl>
1 JOE12_EMI          1 JOE12  EMI          3
2 ABC12_CANC         2 ABC12  CANC         2
3 ABC12_EMI          2 ABC12  EMI          3
4 ABC12_RENE         1 ABC12  RENE         1

您还可以按ID显示输出:

distinct(data_sum %>% dplyr::select(id, sum_freq))
# A tibble: 3 x 2
# Groups:   id [3]
  id    sum_freq
  <fct>    <dbl>
1 EMI          3
2 CANC         2
3 RENE         1