2017-12-18 18 views
1

저는 프로젝트 데이터 입력을 위해 엑셀로 데이터 악몽을 만들었습니다. 두 개의 스프레드 시트에 총 20 개의 탭이 있습니다. 데이터 구조는 각 탭에서 동일합니다. 필자는 스프레드 시트 중 하나에있는 탭 중 하나의 데이터를 CSV 파일로 만들었습니다.이 스프레드 시트는 R 데이터 프레임으로 가져온 다음 의미있는 형식으로 다시 구조화 할 수있는 구조로 병합되었습니다.열의 모든 데이터를 단일 열 (병합하지 않음)로 이동 한 다음 R의 새 열로 나누는 방법은 무엇입니까?

각 탭에는 약 120 개의 열 (샘플링 날짜 수에 따라 다름)과 100 개의 행 (관찰 된 종의 수에 따라 다름)이 있습니다. 각 행은 식물의 종이며 각 열은 특정 날짜 및 특정 위치에 대한 데이터를 포함합니다.

내 (샘플 데이터) 5 (행 및 열) 데이터 프레임을 25 행의 단일 열로 변환하고 싶습니다.

그런 다음 각 행 (레코드 : 예 : "08/10/2017,2에서 3으로, Solidago virgaurea ssp. alpestris, V, vt")에서 데이터를 가져 와서 다음 열로 변환하고 싶습니다. :

날짜, 세그먼트, 종, 코드 1, 코드 2, ...

종에 대한 세그먼트에서 날짜에 각각의 관찰 일 및 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

악몽 은요? Excel 사용자는 해당 단어를 더 자주 사용해야합니다 (upvote). –

답변

1
내가 stack과 함께 기본 R에서, 내 "splitstackshape"패키지에서 cSplit을 건의 할 것

:

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(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"을 선호하는 경우
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"해결책은 결국 얼마나 많은 열을 가지고 있는지에 달려 있습니다.

분명히 실제 옵션으로 head()을 제거하십시오.

+1

'data.table'솔루션은 우아하고 쉽습니다! 이것은 나의 엑셀 악몽을 견딜 수있게했다. 고맙습니다! –