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

Extraction of date occurrences for multiple names

我正在尝试从此电子表格中提取信息(请参阅示例文件)。我有多张这样的床单。我需要记录事件(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 个名字和所有发生的日期,需要为所有人完成此操作

您希望解决从 wide form to long form 转换数据的常见问题。这可以通过 tidyr 包(tidyverse 的一部分)中的 gather 函数来完成。

这是一种将其用于您的数据的方法,以及来自 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)

在 运行 之后我们有:

> head(df)
    NAME      date modality
1 Name.1  2-Feb-15        H
2 Name.1  4-Feb-15        H
3 Name.1  6-Feb-15        H
4 Name.1  9-Feb-15        H
5 Name.1 11-Feb-15        H
6 Name.1 13-Feb-15       HI