首页 > 解决方案 > 分隔具有不同长度的行值并删除其中一个值

问题描述

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

我的数据集从每行的第一列开始,位置/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”,这些值是我需要保留的信息。我的想法是在没有“A”的值之前创建一个 NA 的“占位符”列,然后将整个事物分成 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。

我尝试使用单独的函数,然后删除额外的,但这会导致它删除最后一个值(Year)并将 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

标签: rtidyr

解决方案


假设您的数据框被调用df,这可以使用sub

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

推荐阅读