【问题标题】:Error while subsetting dataframe by rows按行子集数据帧时出错
【发布时间】:2018-05-10 11:13:53
【问题描述】:

我有一个包含 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

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

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

版本:

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

有什么想法吗?

【问题讨论】:

  • 请在这个问题中添加示例数据来演示问题。我没有发现任何问题,但您的数据可能有问题。
  • 也许你可以重启 RStudio 看看错误是否消失。
  • RStudio 只是一个 IDE,所以版本无关紧要,它不可能导致这个子集错误。但是,您的 R 版本和 Matrix 等软件包非常相关。您是否更新了任何其他软件包? (有时它们会作为另一个包的依赖项进行更新)
  • 使用dput(df) 或str(df) 向我们展示您的数据框的结构,以及可重复数据的sn-p(随机种子数据很好)。

标签: r subset


【解决方案1】:

重启 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”列,知道它具有我在特定情况下想要的数据。

如果您需要更多详细信息,请告诉我。

【讨论】:

  • 如果您在问题中包含您的数据,那么很可能有人可以解释这一点
  • 请在您的问题中添加这个额外的上下文,以及可重现数据的 sn-p。当您编写 &lt;- df[, var] 时,我认为 不是文字 var,而是某个变量名的占位符。文字 var 将是 stats::var() 方差函数,并将其分配给 df 列会破坏您的 df。 (最好不要隐藏内置名称)。您可以使用 dput(df) 或 str(df) 向我们展示您的数据框的结构
  • 我编辑了带有数据框特征和一些额外解释的帖子。感谢您的反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2017-08-23
  • 1970-01-01
相关资源
最近更新 更多