

以下画像のようなcsvファイルからDendrite Length列とFilamentID列のデータを取り出すための関数を書いたのですが、  
[![画像の説明をここに入力](https://i.stack.imgur.com/9E2fp.png)](https://i.stack.imgur.com/9E2fp.png)

[code]

    DataandIdExtractionfromCSV <- function(path,sectionid,dataname) {
      
      df = read.csv(path, 
                         fileEncoding = "UTF-8-BOM",
                         stringsAsFactors=F,
                         na.strings="NULL",
      )
      
      df <- na.omit(df)
      # 0,1,2行目を削除
      df2<-df[c(-0,-1,-2),]
      
      
      # 最左列とFilamentIDのdatatypeを変換
      
      df2$dataname <- as.numeric(df2$dataname)
      df2$X.5 <- as.integer(df2$X.5)
      
      
      # Dendrite LengthとFilamentIDをtibble列として再定義、Header(名前)もつける
      tibbledataid = tibble(tibbledataid = df2$dataname)
      tibbledata = tibble(tibbledata = df2$X.5)
      
      # 2列を一つのtibble(行列)に統合
      df_tidy = bind_cols(tibbledataid,tibbledata)
      # 長さと対応するidだけ抽出した行列
      head(df_tidy)
      tidieddfname = paste(sectionid,"_tidy.csv", sep = "", collapse = NULL)
      write.csv(df_tidy, tidieddfname)
      
    }
    
[/code]

これを以下の様に実行すると

[code]

    DataandIdExtractionfromCSV("WT1 x20 ROI1 S ctx 06212021_Statistics/Dendrite_Length.csv","tesuto",Dendrite.Length)
    
[/code]

[code]

    Error during wrapup:  置換は 0 列ですが、データは 133 列です 
    Error: no more error handlers available (recursive errors?); invoking 'abort' restart
    
[/code]

以上のようなエラーが出てしまいます。  
browse()関数でエラー箇所を調べてみたところ、まず

[code]

    df2$dataname <- as.numeric(df2$dataname)
    
[/code]

以上の箇所で引っかかっていることが分かりましたが、それ以上何が原因でどうすればよいのか分かりませんでした。

有識者の方々、何卒ご教示いただけますと幸いです。

追記：[![画像の説明をここに入力](https://i.stack.imgur.com/Hxlvs.png)](https://i.stack.imgur.com/Hxlvs.png)  
コード中のX.5という列名？は以下のように自動で付与されていました。


CC BY-SA 4.0
2021-06-23T06:39:23.667
77732
2023-08-01T02:00:30.057
2021-06-23T11:00:56.130
36869
36869
question
r
Error during wrapup: 置換は 0 列ですが、データは 133 列です　というエラーが解決できない


問題点は `df2$dataname` という表記にあります。この場合、データフレーム `df2` の `dataname`
カラムという意味になってしまいます。なので、indirect access な表記に変更します。

[code]

      ## df2$dataname -> df2[, dataname] へ変更
    
      df2$dataname <- as.numeric(df2$dataname)
      =>
      df2[, dataname] <- as.numeric(df2[, dataname])
    
      tibbledataid = tibble(tibbledataid = df2$dataname)
      =>
      tibbledataid = tibble(tibbledataid = df2[, dataname])
    
[/code]

また、DataandIdExtractionfromCSV 関数呼び出しの際に指定する第3引数を文字列に変更します。

[code]

      ## Dendrite.Length -> "Dendrite.Length" へ変更
    
      DataandIdExtractionfromCSV("...", "tesuto", Dendrite.Length)
      =>
      DataandIdExtractionfromCSV("...", "tesuto", "Dendrite.Length")
    
[/code]


CC BY-SA 4.0
2021-06-23T11:52:02.697
77744
2021-06-23T11:52:02.697
77732
answer


質問からかなり時間も経過していますので御参考です。  
「CSV ファイルから `Dendrite Length` 列と `FilamentID` 列を取り出して，別の CSV
ファイルに書き出す」処理について，`tidyverse` パッケージを用いた記述例を下記に示します。

[code]

    library(tidyverse)
    options(pillar.sigfig = 6)
    
    path <- "Dendrite_Length.csv"
    sectionid <- "tesuto"
    dataname <- "Dendrite Length"
    
    df <- read_csv(path, skip = 2, show_col_types = FALSE)
    df
    ## # A tibble: 7 × 8
    ##   `Dendrite Length` Unit  Category Depth Level  Time FilamentID           ID
    ##               <dbl> <chr> <chr>    <dbl> <dbl> <dbl>      <dbl>        <dbl>
    ## 1          71.1878  um    Dendrite    NA    NA     1  100000373 510000000000
    ## 2           3.84491 um    Dendrite    NA    NA     1  100000378 510000000000
    ## 3           2.72817 um    Dendrite    NA    NA     1  100000378 510000000000
    ## 4          29.3313  um    Dendrite     2     2     1  100000369 510000000000
    ## 5          34.1316  um    Dendrite    NA    NA     1  100000378 510000000000
    ## 6          16.0978  um    Dendrite     2     1     1  100000369 510000000000
    ## 7          28.5015  um    Dendrite     1     1     1  100000369 510000000000
    
    df2 <- df |>
        select(all_of(dataname), FilamentID)
    df2
    ## # A tibble: 7 × 2
    ##   `Dendrite Length` FilamentID
    ##               <dbl>      <dbl>
    ## 1          71.1878   100000373
    ## 2           3.84491  100000378
    ## 3           2.72817  100000378
    ## 4          29.3313   100000369
    ## 5          34.1316   100000378
    ## 6          16.0978   100000369
    ## 7          28.5015   100000369
    
    path2 <- paste0(sectionid, "_tidy.csv")
    write_csv(df2, path2)
    
[/code]

次に，これを基に関数で記述すると下記になります。

[code]

    library(tidyverse)
    options(pillar.sigfig = 6)
    
    DataandIdExtractionfromCSV <- function(path, sectionid, dataname) {
        df <- read_csv(path, skip = 2, show_col_types = FALSE)
        df2 <- df |>
            select(all_of(dataname), FilamentID)
    
        path2 <- paste0(sectionid, "_tidy.csv")
        write_csv(df2, path2)
    }
    DataandIdExtractionfromCSV("Dendrite_Length.csv", "tesuto", "Dendrite Length")
    
    (read_csv("tesuto_tidy.csv", show_col_types = FALSE))
    ## # A tibble: 7 × 2
    ##   `Dendrite Length` FilamentID
    ##               <dbl>      <dbl>
    ## 1          71.1878   100000373
    ## 2           3.84491  100000378
    ## 3           2.72817  100000378
    ## 4          29.3313   100000369
    ## 5          34.1316   100000378
    ## 6          16.0978   100000369
    ## 7          28.5015   100000369
    
[/code]

なお，入力ファイルは下記になります。  
Dendrite_Length.csv:

[code]

    Dendrite Length
    ===============
    Dendrite Length,Unit,Category,Depth,Level,Time,FilamentID,ID
    71.1878,um,Dendrite,,,1,100000373,5.10E+11
    3.84491,um,Dendrite,,,1,100000378,5.10E+11
    2.72817,um,Dendrite,,,1,100000378,5.10E+11
    29.3313,um,Dendrite,2,2,1,100000369,5.10E+11
    34.1316,um,Dendrite,,,1,100000378,5.10E+11
    16.0978,um,Dendrite,2,1,1,100000369,5.10E+11
    28.5015,um,Dendrite,1,1,1,100000369,5.10E+11
    
[/code]


CC BY-SA 4.0
2023-06-05T06:36:35.887
95102
2023-06-05T06:36:35.887
54588
77732
answer