【问题标题】:Accessing data.table with vector of colnames inside function使用函数内的 colnames 向量访问 data.table
【发布时间】:2017-07-01 00:51:12
【问题描述】:

我在尝试使用以下函数获得正确输出时收到错误"Error in myData$ID1 : $ operator is invalid for atomic vectors"。由于某种原因,该函数没有继承列名,因此出现错误invalid for atomic vectors

那么如何正确继承 colnames 以及如何修复此错误?

#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=";")

【问题讨论】:

    标签: r function scope data.table multiple-columns


    【解决方案1】:

    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;"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      相关资源
      最近更新 更多