【问题标题】:How to delete the first row of a dataframe in R?如何删除R中数据框的第一行?
【发布时间】:2011-11-24 09:23:39
【问题描述】:

我有一个包含 11 列的数据集,每列超过 1000 行。这些列被标记为 V1、V2、V11 等。 我使用“c”命令将名称替换为对我更有用的名称。 我没有意识到第 1 行还包含每列的标签,而我的实际数据从第 2 行开始。

有没有办法删除第1行并递减?

【问题讨论】:

    标签: r dataset


    【解决方案1】:

    保留原始文件中的标签,如下所示:

    df = read.table('data.txt', header = T)
    

    如果您有名为 x 和 y 的列,您可以这样处理它们:

    df$x
    df$y
    

    如果您想实际删除 data.frame 中的第一行,可以使用如下负索引:

    df = df[-1,]
    

    如果您想从 data.frame 中删除一列,您可以为其分配 NULL:

    df$x = NULL
    

    下面是一些如何在 R 中创建和操作 data.frame 的简单示例:

    # create a data.frame with 10 rows
    > x = rnorm(10)
    > y = runif(10)
    > df = data.frame( x, y )
    
    # write it to a file
    > write.table( df, 'test.txt', row.names = F, quote = F )
    
    # read a data.frame from a file: 
    > read.table( df, 'test.txt', header = T )
    
    > df$x
     [1] -0.95343778 -0.63098637 -1.30646529  1.38906143  0.51703237 -0.02246754
     [7]  0.20583548  0.21530721  0.69087460  2.30610998
    > df$y
     [1] 0.66658148 0.15355851 0.60098886 0.14284576 0.20408723 0.58271061
     [7] 0.05170994 0.83627336 0.76713317 0.95052671
    
    > df$x = x
    > df
                y           x
    1  0.66658148 -0.95343778
    2  0.15355851 -0.63098637
    3  0.60098886 -1.30646529
    4  0.14284576  1.38906143
    5  0.20408723  0.51703237
    6  0.58271061 -0.02246754
    7  0.05170994  0.20583548
    8  0.83627336  0.21530721
    9  0.76713317  0.69087460
    10 0.95052671  2.30610998
    
    > df[-1,]
                y           x
    2  0.15355851 -0.63098637
    3  0.60098886 -1.30646529
    4  0.14284576  1.38906143
    5  0.20408723  0.51703237
    6  0.58271061 -0.02246754
    7  0.05170994  0.20583548
    8  0.83627336  0.21530721
    9  0.76713317  0.69087460
    10 0.95052671  2.30610998
    
    > df$x = NULL
    > df 
                y
    1  0.66658148
    2  0.15355851
    3  0.60098886
    4  0.14284576
    5  0.20408723
    6  0.58271061
    7  0.05170994
    8  0.83627336
    9  0.76713317
    10 0.95052671
    

    【讨论】:

    • 我不确定@akz 是否清楚:在header=T 中,T 代表TRUE,所以这个参数告诉R 加载标题。详情请见?read.table
    • 请注意,如果您有单列数据框,请查看此答案 - stackoverflow.com/a/3232770/4606130 在负索引时您还需要 drop = FALSE
    【解决方案2】:

    您可以使用负索引来删除行,例如:

    dat <- dat[-1, ]
    

    这是一个例子:

    > dat <- data.frame(A = 1:3, B = 1:3)
    > dat[-1, ]
      A B
    2 2 2
    3 3 3
    > dat2 <- dat[-1, ]
    > dat2
      A B
    2 2 2
    3 3 3
    

    也就是说,您可能会遇到更多问题,而不仅仅是删除最终出现在第 1 行的标签。R 更有可能将数据解释为文本,然后转换为因子。检查str(foo),其中foo 是您的数据对象,说明数据类型。

    听起来您只需要在调用中使用header = TRUE 即可读取数据(假设您通过read.table() 或其包装器之一读取数据。)

    【讨论】:

      【解决方案3】:

      虽然我同意投票最多的答案,但这是另一种保留除第一行以外的所有行的方法:

      dat <- tail(dat, -1)
      

      这也可以使用 Hadley Wickham 的 dplyr 包来完成。

      dat <- dat %>% slice(-1)
      

      【讨论】:

        【解决方案4】:

        可能没有人真的想删除第一行。因此,如果您正在寻找有意义的东西,那就是条件选择

        #remove rows that have long length and "0" value for vector E
        
        >> setNew<-set[!(set$length=="long" & set$E==0),]
        

        【讨论】:

        • 这是一个没有被问到的问题的答案。我认为这比帮助更令人困惑。
        【解决方案5】:

        我不是专家,但这也可以,

        dat <- dat[2:nrow(dat), ]
        

        【讨论】:

        • 其实nrow(dat) == 1时这样不行:那就保留原来的dat。
        【解决方案6】:

        dat &lt;- dat[-1, ] 工作但它杀死了我的数据框,将其更改为另一种类型。不得不改为使用 dat &lt;- data.frame(dat[-1, ]) 但这可能是一种特殊情况,因为此数据框最初只有一列。

        【讨论】:

        • 这是评论,不是答案!尽管如此,我还是无法复制。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        • 1970-01-01
        • 2020-08-16
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2021-11-30
        相关资源
        最近更新 更多