提取多个名称的日期出现次数

时间:2018-04-03 16:42:59

标签: r date dataframe extraction

我正在尝试从此电子表格中提取信息(请参阅示例文件)。我有这样的多张床单。我需要记录事件(H,HI等)发生的名称和日期。我正在整理一个主数据集(类似于最终文件中所示)。列出每个日期以及姓名和字母代码(模态)。

我一直在尝试使用拆分功能。但它为我提供了无效的清单。

谢谢, 约旦

示例数据

Feb-15                                                                                                              
NAME    1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28
Name 1      H       H       H           H       H       HI          H       H       H           H       H       H   
Name 2      H       H   H       H       H   H       H       H       H   H   C   H       H       H   H       H       H
Name 3      H   H   H   H   H   H       H   H   H   H   H   H       H   H   H   H   H   H       H   H   H   H   H   H
Name 4      H   H   H       H   H       H   H   H       H   H       H   H   H   H       H       H   H   H       H   H
Name 5          H           H   H           H       H       H           H       H       H           H       H       H
Name 6              HA  HA  HA  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI
Name 7                                                  C                                                           
Name 8                      C                                                                                       
Name 9                                                                                                          HA  HA
Name 10     HI  HI  HI  HI  HI          HI  HI                                                                      

期望的最终结果

name    date    modality
Name 1  2-Feb-15    H
Name 1  4-Feb-15    H
Name 1  6-Feb-15    H
Name 1  9-Feb-15    H
Name 1  11-Feb-15   H
Name 1  13-Feb-15   HI
Name 1  16-Feb-15   H
Name 1  18-Feb-15   H
Name 1  20-Feb-15   H
Name 1  23-Feb-15   H
Name 1  25-Feb-15   H
Name 1  27-Feb-15   H
Name 2  2-Feb-15    H
Name 2  4-Feb-15    H
Name 2  5-Feb-15    H
Name 2  7-Feb-15    H
Name 2  9-Feb-15    H
Name 2  10-Feb-15   H
Name 2  12-Feb-15   H
Name 2  14-Feb-15   H
Name 2  16-Feb-15   H
Name 2  17-Feb-15   H
Name 2  18-Feb-15   C
Name 2  19-Feb-15   H
Name 2  21-Feb-15   H
Name 2  23-Feb-15   H
Name 2  24-Feb-15   H
Name 2  26-Feb-15   H
Name 2  28-Feb-15   H

期望的结果只显示前2个名字和所有发生的日期,需要为所有人完成

1 个答案:

答案 0 :(得分:3)

您正在寻找解决从wide form to long form转换数据的常见问题。这可以使用#[110000 rows x 3 columns] df = pd.concat([df] * 10000, ignore_index=True) In [364]: %%timeit ...: (df['A'] + '/' + df['B'] + '/' + df['C'] + '/X').values.tolist() ...: 60.2 ms ± 1.04 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) In [365]: %%timeit ...: df.apply(lambda x: '/'.join(x), axis=1).add('/X').tolist() ...: 2.48 s ± 39.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [366]: %%timeit ...: list1, list2, list3 = df['A'].tolist(), df['B'].tolist(), df['C'].tolist() ...: for i in zip(list1, list2, list3): ...: val = map(str, i) ...: keylist.append('/'.join(val)) ...: keylist[-1] += '/X' ...: 192 ms ± 78.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) In [367]: %%timeit ...: df.iloc[:,0].str.cat([df[c] for c in df.columns[1:]],sep='/').tolist() ...: 61.1 ms ± 540 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) In [368]: %%timeit ...: df.assign(New='X').apply('/'.join,1).tolist() ...: 2.51 s ± 76.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [369]: %%timeit ...: ['{0}/{1}/{2}/X'.format(i, j, k) for i, j, k in df.values.tolist()] 74.6 ms ± 2.27 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 包中的gather函数(tidyverse的一部分)来完成。

以下是将其与您的数据一起使用的一种方法,以及来自tidyr包的一些额外调用以帮助格式化它:

dplyr

运行后我们有:

library(dplyr)
library(tidyr)

df <- read.table(text="
NAME     1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28
Name.1   NA  H   NA  H   NA  H   NA  NA  H   NA  H   NA  HI  NA  NA  H   NA  H   NA  H   NA  NA  H   NA  H   NA  H   NA 
Name.2   NA  H   NA  H   H   NA  H   NA  H   H   NA  H   NA  H   NA  H   H   C   H   NA  H   NA  H   H   NA  H   NA  H
Name.3   NA  H   H   H   H   H   H   NA  H   H   H   H   H   H   NA  H   H   H   H   H   H   NA  H   H   H   H   H   H
Name.4   NA  H   H   H   NA  H   H   NA  H   H   H   NA  H   H   NA  H   H   H   H   NA  H   NA  H   H   H   NA  H   H
Name.5   NA  NA  H   NA  NA  H   H   NA  NA  H   NA  H   NA  H   NA  NA  H   NA  H   NA  H   NA  NA  H   NA  H   NA  H
Name.6   NA  NA  NA  HA  HA  HA  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI  HI
Name.7   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  C   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
Name.8   NA  NA  NA  NA  NA  C   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
Name.9   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  HA  HA
Name.10  NA  HI  HI  HI  HI  HI  NA  NA  HI  HI  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA", header = T)

mon.yr <- "Feb-15"

df <- gather(df, key = "date", value = "modality", 2:ncol(df)) %>% 
      filter(!is.na(modality)) %>% 
      mutate(date = sub('X(\\d+)', paste0('\\1-', mon.yr), date)) %>% 
      arrange(NAME)