首页 文章

如何将列中的所有数据移动到单个列(不合并),然后拆分为R中的新列?

提问于
浏览
1

我使用Excel创建了一个数据噩梦来进行项目数据输入 . 我有两个电子表格,总共有20个标签 . 每个选项卡中的数据结构相同 . 我已设法创建一个CSV文件,其中一个电子表格中的一个标签中的数据合并为一个结构,我希望可以将其导入R数据帧,然后重新构造成一个有意义的格式 .

每个标签有大约120列(取决于采样日期的数量)和100行(取决于观察到的物种数) . 每行是一种植物,每列包含特定日期和特定位置的数据 .

我想将我的(样本数据)五乘五(行和列)数据帧转换为一行25行 .

然后我想从每一行获取数据(记录,例如:“08/10 / 2017,2到3,Solidago virgaurea ssp.alpestris,V,vt”)并将其转换为以下列:

日期,细分,品种,代码1,代码2,......

物种的一个段的日期上的每个观察包含1到7个不同的代码,因此每个记录的列数将产生4到10列 . 注意结果将遵循上述结构 . 每个观察都用引号括起来,数据用逗号分隔 .

谢谢您的帮助!

test <- structure(list(V120 = c("03/10/2017,3 to 4,Salix phylicifolia,Y", 
"03/10/2017,3 to 4,Saussurea alpina,Y", "03/10/2017,3 to 4,Silene dioica,Y", 
"03/10/2017,3 to 4,Solidago virgaurea ssp. alpestris,Y", "03/10/2017,3 to 4,Sorbus aucuparia ssp. glabrata,Y"), V121 = c("03/10/2017,4 to 5,Salix phylicifolia,C,0,g1,L3", "03/10/2017,4 to 5,Saussurea alpina,Y", "03/10/2017,4 to 5,Silene dioica,Y", "03/10/2017,4 to 5,Solidago virgaurea ssp. alpestris,Y", "03/10/2017,4 to 5,Sorbus aucuparia ssp. glabrata,Y"), V122 = c("08/10/2017,1 to 2,Salix phylicifolia,Vb,L4", "08/10/2017,1 to 2,Saussurea alpina,uf,V,vt", "08/10/2017,1 to 2,Silene dioica,Vb,vt", "08/10/2017,1 to 2,Solidago virgaurea ssp. alpestris,V,vt", "08/10/2017,1 to 2,Sorbus aucuparia ssp. glabrata,L4"), V123 = c("08/10/2017,2 to 3,Salix phylicifolia,L4", "08/10/2017,2 to 3,Saussurea alpina,uf,V,vt", "08/10/2017,2 to 3,Silene dioica,vt", "08/10/2017,2 to 3,Solidago virgaurea ssp. alpestris,V,vt", "08/10/2017,2 to 3,Sorbus aucuparia ssp. glabrata,Y"), V124 = c("08/10/2017,3 to 4,Salix phylicifolia,Y", "08/10/2017,3 to 4,Saussurea alpina,Y", "08/10/2017,3 to 4,Silene dioica,Y", "08/10/2017,3 to 4,Solidago virgaurea ssp. alpestris,Y", "08/10/2017,3 to 4,Sorbus aucuparia ssp. glabrata,Y")), .Names = c("V120", "V121", "V122", "V123", "V124"), row.names = 41:45, class = "data.frame")

1 回答

  • 1

    我建议"splitstackshape"来自我的"splitstackshape"包,以及来自基地R的 stack

    library(splitstackshape)
    head(cSplit(stack(test), "values", ","))
    #     ind   values_1 values_2                          values_3 values_4 values_5 values_6 values_7
    # 1: V120 03/10/2017   3 to 4                Salix phylicifolia        Y       NA       NA       NA
    # 2: V120 03/10/2017   3 to 4                  Saussurea alpina        Y       NA       NA       NA
    # 3: V120 03/10/2017   3 to 4                     Silene dioica        Y       NA       NA       NA
    # 4: V120 03/10/2017   3 to 4 Solidago virgaurea ssp. alpestris        Y       NA       NA       NA
    # 5: V120 03/10/2017   3 to 4    Sorbus aucuparia ssp. glabrata        Y       NA       NA       NA
    # 6: V121 03/10/2017   4 to 5                Salix phylicifolia        C        0       g1       L3
    

    或者您可以直接使用“data.table”,如下所示:

    library(data.table)
    head(setDT(test)[, list(var = unlist(.SD))][, tstrsplit(var, ",")])
    #            V1     V2                                V3 V4 V5 V6 V7
    # 1: 03/10/2017 3 to 4                Salix phylicifolia  Y NA NA NA
    # 2: 03/10/2017 3 to 4                  Saussurea alpina  Y NA NA NA
    # 3: 03/10/2017 3 to 4                     Silene dioica  Y NA NA NA
    # 4: 03/10/2017 3 to 4 Solidago virgaurea ssp. alpestris  Y NA NA NA
    # 5: 03/10/2017 3 to 4    Sorbus aucuparia ssp. glabrata  Y NA NA NA
    # 6: 03/10/2017 4 to 5                Salix phylicifolia  C  0 g1 L3
    

    如果您更喜欢“tidyverse”,您可以尝试以下方法:

    library(tidyverse)
    test %>%
      gather(var, val, everything()) %>%
      separate(val, into = c("Date", "Segment", "Species", paste("Code", 1:7, sep = "_")), sep = ",") %>%
      head()
    #    var       Date Segment                           Species Code_1 Code_2 Code_3 Code_4 Code_5
    # 1 V120 03/10/2017  3 to 4                Salix phylicifolia      Y   <NA>   <NA>   <NA>   <NA>
    # 2 V120 03/10/2017  3 to 4                  Saussurea alpina      Y   <NA>   <NA>   <NA>   <NA>
    # 3 V120 03/10/2017  3 to 4                     Silene dioica      Y   <NA>   <NA>   <NA>   <NA>
    # 4 V120 03/10/2017  3 to 4 Solidago virgaurea ssp. alpestris      Y   <NA>   <NA>   <NA>   <NA>
    # 5 V120 03/10/2017  3 to 4    Sorbus aucuparia ssp. glabrata      Y   <NA>   <NA>   <NA>   <NA>
    # 6 V121 03/10/2017  4 to 5                Salix phylicifolia      C      0     g1     L3   <NA>
    #   Code_6 Code_7
    # 1   <NA>   <NA>
    # 2   <NA>   <NA>
    # 3   <NA>   <NA>
    # 4   <NA>   <NA>
    # 5   <NA>   <NA>
    # 6   <NA>   <NA>
    

    “tidyverse”解决方案取决于你知道最后会有多少列,在你知道的情况下 .

    显然,请使用您的实际数据从这些选项中删除 head() ...

相关问题