2016-07-13 4 views
0

(을 - 다른 관련성이없는 열입니다)R : (데이터 프레임의 일부로서) 목록의 벡터에 서로 다른 길이의 목록의 목록을 변이 나는이 같은 data.frame로 변환하는 CSV 파일이

C1 C2  C3 C4 C5 Start  End  C8 
A  1  -  -  - [1,4,7] [3,6,10] - 
A  2  -  -  -  [12]  [14]  - 
A  3  -  -  -  [16,19] [17,21]  - 
A  4  -  -  -  [22]  [24]  - 

각 부분에서 시작과 끝의 범위를 반복적으로 계산하려고합니다.

Format the Start and End columns into lists 
```{r} 
vect <- function(fac){ 
    str <- as.character(fac) 
    return(as.list(strsplit(substr(str,2,nchar(str)-1),","))) 
    #return(data.frame(lapply(str, `length<-`, max(lengths(str))))) 
} 
```` 

Read in experimental data 
```{r} 
data <- read.csv("elution_peptides_positions_arath.csv", sep=",",header=TRUE) 
data <- mutate(data,Start=vect(Start),End=vect(End)) 
data$X <- NULL 
``` 

문제가 있다는 것입니다 :

표기는 R에 정말 문자 그대로 파이썬하지 평가하는 데 유용 물론

,하지만 난이 기능을 사용하여 시도했다 (벡터 대신에) 열로리스트를 제공하는 이유는 모르겠다!

> class(data$Start) 
[1] "list" 

나는이 오류를 범

data <- as.data.frame(lapply(data, unlist)) 

와 벡터에 목록을 변환 할 때 :

Error: wrong result size (35676), expected 35568 or 1 

내가 할 수있는 기능을 적용하는 벡터로 그들이 필요를 첫 번째 요소로 정렬합니다 (다음과 같이 동작 할 것입니다).

id <- order(sapply(data$Start,function(i)i[1])) 
data <- data[order(data$Start),] 
하지만 목록을 통해 이렇게하면이 오류를 범

:

Error in order(data_protein$Start) : 
unimplemented type 'list' in 'orderVector1' 

그래서 내가 벡터에 해당 열을 변환해야한다고 생각.

첫 번째 오류의 원인은 무엇입니까? 어떻게 해결할 수 있을까요?

답변

3

귀하의 vect() 기능은 두 가지 문제점을 제외하고 잘 작성되어 있습니다. 먼저 strsplit()은 항상 목록을 반환하기 때문에 as.list() 강제 변환이 필요하지 않습니다. 둘째로, 숫자를 숫자로 강제 변환해야합니다. 특히 나중에 수치로 정렬하려는 경우에 특히 그렇습니다. 문자열 화 된 숫자는 사 전적으로 잘못 정렬됩니다. (함수 내에서 평가 된 최종 식의 값이 자동으로 반환되기 때문에 어느쪽으로 작동하지만 또한,이 경우, 당신은 심지어 return()없이 return() 전화를 생략 할 수 있습니다.)

그래서 우리가 가진 :

vect <- function(fac) { 
    str <- as.character(fac); 
    lapply(strsplit(substr(str,2L,nchar(str)-1L),','),as.integer); 
}; ## end vect() 

df$Start <- vect(df$Start); 
df$End <- vect(df$End); 
df; 
## C1 C2 C3 C4 C5 Start  End C8 
## 1 A 1 - - - 1, 4, 7 3, 6, 10 - 
## 2 A 2 - - -  12  14 - 
## 3 A 3 - - - 16, 19 17, 21 - 
## 4 A 4 - - -  22  24 - 

데이터

df <- data.frame(C1=c('A','A','A','A'),C2=c(1L,2L,3L,4L),C3=c('-','-','-','-'),C4=c('-','-', 
'-','-'),C5=c('-','-','-','-'),Start=c('[1,4,7]','[12]','[16,19]','[22]'),End=c('[3,6,10]', 
'[14]','[17,21]','[24]'),C8=c('-','-','-','-'),stringsAsFactors=F); 

당신의 INTE과 함께 고유의 문제가 있습니다 nt를 사용하여 목록 열을 벡터로 변환합니다. R data.frame 유형은 모든 열의 길이가 동일하도록합니다. 따라서 StartEnd 열을 원자 벡터로 나열하려고하면 길이가 다른 모든 열의 길이를 초과하므로 오류 메시지가 표시됩니다.

데이터를 주문하려는 경우.

df[order(sapply(df$Start,`[`,1L)),]; 
## C1 C2 C3 C4 C5 Start  End C8 
## 1 A 1 - - - 1, 4, 7 3, 6, 10 - 
## 2 A 2 - - -  12  14 - 
## 3 A 3 - - - 16, 19 17, 21 - 
## 4 A 4 - - -  22  24 - 

은 (이 예 data.frame 이미 문제의 순서를 소유하고 있음을 주목해야한다 : 다음과 같이 더 간결하게 할 수 있지만 각 Start 벡터의 첫 번째 숫자에 의해 프레임, 당신의 id 계산, 완벽 위의 코드 줄을 실행하기 전에 테스트 데이터를 만들 때 항상 test coverage의 문제를 고려하는 것이 좋습니다.