2017-07-01 5 views
-1

を取得しようとすると、エラー"Error in myData$ID1 : $ operator is invalid for atomic vectors"が発生します。以下の関数を使用して、出力を修正してください。なんらかの理由で、この関数は継承された列名を取得しないため、エラーinvalid for atomic vectorsが発生します。function内のcolnameのベクトルでdata.tableにアクセス

したがって、継承された列名を正しく取得する方法と、このエラーを修正する方法はありますか?

#HOW TO DO THIS WITH apply below? 
myData <- data.table(ID1=c("1;11","2;22","3;33"),ID2=c("a;b","c;d",";")) 

readMyRow <- function(myData, myIndex) 
{ 
    #TODO: Error is here because col names not inherited, why? 
    s3<- strsplit(myData$`ID1`, split=";") 
    s4<- strsplit(myData$`ID2`, split=";") 
    return(paste(s3[[myIndex]], s4[[myIndex]], sep=";")) 
} 

#Combine all rows 
myData$Combined <- apply(myData, 1, readMyRow) 

正しい出力

myData <- data.table(ID1=c("1;11","2;22","3;33"),ID2=c("a;b","c;d",";")) 
s3<- strsplit(myData$`ID1`, split=";") 
s4<- strsplit(myData$`ID2`, split=";") 
paste(s3[[1]], s4[[1]], sep=";") 
paste(s3[[2]], s4[[2]], sep=";") 
paste(s3[[3]], s4[[3]], sep=";") 

答えて

2

TL;行はベクターに回すDR、それに応じてそれらを処理する必要があります。

セットアップ:

myData <- data.table(ID1=c("1;11","2;22","3;33"),ID2=c("a;b","c;d",";")) 

readMyRow <- function(myData, myIndex) 
{ 
    #TODO: Error is here because col names not inherited, why? 
    s3<- strsplit(myData$`ID1`, split=";") 
    s4<- strsplit(myData$`ID2`, split=";") 
    return(paste(s3[[myIndex]], s4[[myIndex]], sep=";")) 
} 

我々debug(readMyRow)、その後apply(myData,1,readMyRow)は、関数に取得した後、我々は行は文字ベクトルに縮小されていることがわかり、str()を行う場合。

str(myData) 
Named chr [1:2] "1;11" "a;b" 
- attr(*, "names")= chr [1:2] "ID1" "ID2") 

$アクセサは、原子のベクトルが、[[意志では動作しません:

readMyRow <- function(myData, myIndex=1) { 
    s3 <- strsplit(myData[["ID1"]], split=";") 
    s4 <- strsplit(myData[["ID2"]], split=";") 
    return(paste(s3[[myIndex]], s4[[myIndex]], sep=";")) 
} 

(私もmyIndexのデフォルト値を追加しました:特に関数は、指定されたインデックスなしでは動作しません。 )

apply(myData,1,readMyRow) 
    [,1] [,2] [,3] 
[1,] "1;a" "2;c" "3;" 
[2,] "11;b" "22;d" "33;" 
関連する問題