Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将列中的所有数据移动到单个列中(不合并),然后在R中拆分为新列?_R_Dataframe_Merge_Format - Fatal编程技术网

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

如何将列中的所有数据移动到单个列中(不合并),然后在R中拆分为新列?,r,dataframe,merge,format,R,Dataframe,Merge,Format,我用Excel创建了一个数据噩梦来输入我们的项目数据。我有两个电子表格,总共有20个标签。每个选项卡中的数据结构都是相同的。我已经成功地创建了一个CSV文件,其中一个电子表格中的一个选项卡中的数据合并到一个结构中,我希望可以导入到R数据框中,然后重新构造成一种有意义的格式 每个选项卡大约有120列(取决于采样日期的数量)和100行(取决于观察到的物种数量)。每行是一种植物,每列包含特定日期和特定位置的数据 我想将我的(示例数据)五乘五(行和列)数据帧转换为一个包含25行的列 然后,我想从每一行获

我用Excel创建了一个数据噩梦来输入我们的项目数据。我有两个电子表格,总共有20个标签。每个选项卡中的数据结构都是相同的。我已经成功地创建了一个CSV文件,其中一个电子表格中的一个选项卡中的数据合并到一个结构中,我希望可以导入到R数据框中,然后重新构造成一种有意义的格式

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

我想将我的(示例数据)五乘五(行和列)数据帧转换为一个包含25行的列

然后,我想从每一行获取数据(记录,例如:“2017年10月8日,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")

test我建议从我的“splitstackshape”包中选择
cSplit
,并从base 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)
测试%>%
聚集(var、val、everything())%>%
分离(val,分为=c(“日期”、“段”、“种类”、粘贴(“代码”,1:7,sep=“”)),sep=“,”%>%
总目()
#变量日期段物种代码\u 1代码\u 2代码\u 3代码\u 4代码\u 5
#1 V120 03/10/2017 3至4酸柳
#2 V120 03/10/2017 3至4高山雪莲Y
#2017年10月3日第120期第3至4期Silene dioica Y
#4 V120 03/10/2017 3至4 Solidago virgaurea ssp。阿尔卑斯山
#5 V120 03/10/2017 3至4桃花花楸ssp。无脊椎动物
#6 V121 03/10/2017 4至5酸柳C 0 g1 L3
#代码6代码7
# 1      
# 2      
# 3      
# 4      
# 5      
# 6      
“tidyverse”解决方案取决于您知道最终将有多少列,在您的情况下,您知道这些


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

?Excel用户应该更经常地使用upvote这个词。您的“data.table”解决方案既优雅又简单!这让我的噩梦可以忍受。非常感谢。