2016-07-13 13 views
0

私はこのようなdata.frameに変換CSVファイル有する( - 他の無関係な列である)をR:(データフレームの一部として)リストのベクターに異なる長さのリストのリストを変異

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]  - 

ここでは、StartとEndの各メンバーの間の範囲を繰り返し計算するつもりです。

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で本当に文字通りPythonではなく、評価するのに便利です。もちろん、

が、私はそれを、この機能を使って試してみましたそれは列のリスト(ベクトルの代わりに)を離れて与える、私はなぜか分からない!

私は

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

でベクターにリストを変換しようとすると、それはこのエラーを離れて与え

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

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()の機能は、2つの問題を除いてよく書かれています。まず、strsplit()は常にリストを返すので、as.list()強制は必要ありません。第2に、数値を文字から数値に強制する必要があります。特に、後で数字順に並べ替えることを計画している場合は特にそうです。文字列化された数字は、辞書順に正しく並べ替えられません。 (関数内で評価され、最終的な式の値が自動的に返されるので、いずれかの方法で動作しますが、この場合も、あなたは、さえ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に固有の問題がありますリスト列をベクトルに変換する。 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の問題を検討することをお勧めします)。

関連する問題