分隔具有不同长度的行值并删除其中一个值

时间:2019-04-01 20:36:14

标签: r tidyr

我正在尝试将数据集转换为整齐的格式以用于项目,但是我一直坚持将行值分成不同的列,因为其中一些具有额外的值,但它们位于左侧我需要的信息。

我的数据集从每一行的第一列开始,并带有位置/ ID /年份

# A tibble: 6 x 190
  Strains_w_Seq `HK/1/1968` `HK/107/1971` `BI/21793/1972` `EN/42/1972` 
  <chr>         <chr>       <chr>         <chr>           <chr>                
1 BI/16190/1968 640         0             640             320                     
2 BI/16398/1968 1163        0             0               1163                   
3 HK/1/1968     1280        1280          0               2560                  
4 BI/808/1969   320         0             0               640                    
5 BI/908/1969   1280        0             0               640                    
6 BI/17938/1969 554         0             0               453                     

但是它以以下格式结尾:类型/位置/ ID /年份

A tibble: 6 x 190
  Strains_w_Seq `HK/1/1968` `HK/107/1971` `BI/21793/1972` `EN/42/1972` 
  <chr>         <chr>       <chr>         <chr>           <chr>            
1 A/ONTARIO/RV… 0           0             0               0                       
2 A/ONTARIO/RV… 0           0             0               0                       
3 A/ONTARIO/RV… 0           0             0               0     

我想在其余值之前删除“ A”,这是我需要保留的信息。我的想法是在值之前使用NA的“占位符”列,而不使用“ A”,然后将整个对象分成4个对象的向量。

例如:

NA/BI/16398/1968
NA/BI/16398/1968
NA/BI/16398/1968
NA/BI/16398/1968
...
A/TAIWAN/864/2007 
A/TAIWAN/864/2007
A/TAIWAN/864/2007
A/TAIWAN/864/2007

这样可以做到,这样我就可以根据“ /”进行分隔,然后简单地删除我添加的NA和多余的A的列。

我尝试使用单独的函数,然后删除多余的函数,但这会导致它删除最后一个值(年份)并将A放入“ Geo_Origin”列中

library(tidyverse)
df <- separate(df, Strains_w_Seq, into = c("Geo_Origin", "Strain_Num", "Isolation_Year"), sep = "/", extra = "drop")

我不认为我可以使用fill =“ left”,因为没有实际的信息可以拉到左边。

为了防止丢失数据,我以

结尾
df <- separate(df, Strains_w_Seq, into = c("Geo_Origin", "Strain_Num", "Isolation_Year"), sep = "/", extra = "merge")

使用

可以正确处理前800个观测值
TAIWAN  864  2007
TAIWAN  864  2007

但是我仍然可以从下面获得200多个观察结果:

A  TAIWAN  864/2007
A  TAIWAN  864/2007
A  TAIWAN  864/2007

1 个答案:

答案 0 :(得分:1)

假设您的数据帧称为df,可以使用sub

df$Strains_w_Seq = sub("^A/", "", df$Strains_w_Seq)