按行对数据帧进行子集时出错

时间:2018-05-10 11:13:53

标签: r subset

我有一个包含120个观察值和10个变量的数据帧。我有一行代码用于对其进行子集化以仅提取某些特定行

  df_reduc_expr <- which(df$Speciestreat != 'Bac + Junc')
  df_reduc <- df[df_reduc_expr,]

它一直工作,直到它停止并开始抛出错误

Error: Column indexes must be at most 1 if positive, not 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105

如果我在逗号后加上一些数字,就好像我也要求列的子集一样,错误就会停止。但是,只要我离开用于提取所有列的表达式,它似乎与行混淆并抛出错误。

我甚至不知道从哪里开始寻找这种行为的原因。

版本:

  • Matrix包1.2-14。我认为唯一可能是搞乱的是我必须手动安装它(使用RStudio和.tar.gz),因为我的版本使用的是1.2-6,我需要更新的脚本其他部分。我不知道它是否会影响。
  • RStudio 1.0.136

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

重启R没有成功。但是我遇到了这个问题,尽管我仍然不明白发生了什么。

问题出在原始数据框df中。在上一行中,我创建了一个新列并使用

指定了一些值
df$notransf <- df[, var]

显然它改变了数据框中的某些内容并且效果不佳。

我把它改成了

df["notransf"] <- df[, var]

它恢复了正常行为。

出于教育目的,你知道为什么会这样吗?

修改1.额外数据

很抱歉,不包括这个问题。数据框看起来像这样

Salinity Immersion Speciestreat Species Repetition   Box Soil    `Mean Aboveground length (mm)` Salinity_num Immersion_num Repetition_F notransf
   <fct>    <fct>     <ord>        <chr>        <dbl> <dbl> <fct>                            <dbl>        <dbl>         <dbl> <fct>           <dbl>
 1 5        0         Bac + Junc   Juncus          1.    2. invaded                          10.4            5.            0. 1               10.4 
 2 5        0         Bac + Junc   Juncus          2.    4. invaded                           6.49           5.            0. 2                6.49
 3 5        0         Bac + Junc   Juncus          3.    6. invaded                          NA              5.            0. 3               NA   
 4 5        0         Bac + Junc   Juncus          4.    8. invaded                           6.21           5.            0. 4                6.21
 5 5        0         Bac + Junc   Juncus          5.   10. invaded                           3.92           5.            0. 5                3.92
 6 5        20        Bac + Junc   Juncus          1.    2. invaded                           6.74           5.           20. 1                6.74
 7 5        20        Bac + Junc   Juncus          2.    4. invaded                           7.10           5.           20. 2                7.10
 8 5        20        Bac + Junc   Juncus          3.    6. invaded                          14.7            5.           20. 3               14.7 
 9 5        20        Bac + Junc   Juncus          4.    8. invaded                           9.77           5.           20. 4                9.77
10 5        20        Bac + Junc   Juncus          5.   10. invaded                           5.77           5.           20. 5                5.77


Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   180 obs. of  12 variables:
 $ Salinity                    : Factor w/ 3 levels "0","5","18": 2 2 2 2 2 2 2 2 2 2 ...
 $ Immersion                   : Factor w/ 3 levels "0","20","40": 1 1 1 1 1 2 2 2 2 2 ...
 $ Speciestreat                : Ord.factor w/ 2 levels "Bac + Junc"<"Juncus": 1 1 1 1 1 1 1 1 1 1 ...
 $ Species                     : chr  "Juncus" "Juncus" "Juncus" "Juncus" ...
 $ Repetition                  : num  1 2 3 4 5 1 2 3 4 5 ...
 $ Box                         : num  2 4 6 8 10 2 4 6 8 10 ...
 $ Soil                        : Factor w/ 2 levels "invaded","recovered": 1 1 1 1 1 1 1 1 1 1 ...
 $ Mean Aboveground length (mm): num  10.36 6.49 NA 6.21 3.92 ...
 $ Salinity_num                : num  5 5 5 5 5 5 5 5 5 5 ...
 $ Immersion_num               : num  0 0 0 0 0 20 20 20 20 20 ...
 $ Repetition_F                : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 1 2 3 4 5 ...
 $ notransf                    : num  10.36 6.49 NA 6.21 3.92 ...

var是一个字符串变量,对于这种情况是

var = "Mean Aboveground length (mm)"

我最初想要的是删除Speciestreat列中具有Bac + Junc值的行。

var变量的用法是因为在代码中,我需要引用要使用的数据,有时在一列中,有时在另一列中,所以我用名称定义var变量列a想要分析,并在其余代码中引用“notransf”列,知道它具有我想要的特定情况下的数据。

如果您需要更多详细信息,请与我们联系。