如何在R中删除数据框的第一行?

99

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

有没有办法删除第一行并减少行数?

6个回答

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

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

如果你的列名为x和y,你可以像这样引用它们:
df$x
df$y

如果您想从数据框中实际删除第一行,可以使用负索引,如下所示:
df = df[-1,]

如果您想从数据框中删除一列,可以将其赋值为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

3
我不确定@akz是否清楚,在header=T中,T代表TRUE,因此该参数告诉R加载标题。有关详细信息,请参见?read.table - daroczig
请注意,如果您有一个单列数据框,则请查看此答案-https://dev59.com/N0_Sa4cB1Zd3GeqP8gVc#3232770,在负索引时也需要`drop = FALSE` - micstr

31

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

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

话虽如此,你可能不仅需要删除在第一行的标签。更有可能的是,R已将数据解释为文本,然后转换为因子。检查str(foo),其中foo 是您的数据对象,了解数据类型。

听起来您只需要在读取数据时的调用中添加header = TRUE(假设您是通过read.table()或其包装之一来读取数据的)。


26

虽然我同意得到最多票数的答案,这里还有另一种方法来保留除第一行之外的所有行:

dat <- tail(dat, -1)

这也可以通过使用Hadley Wickham的 dplyr软件包来实现。

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

12

大概没有人真的想删除第一行。因此,如果您正在寻找有意义的内容,那就是条件选择。

#remove rows that have long length and "0" value for vector E

>> setNew<-set[!(set$length=="long" & set$E==0),]

这是对一个未被提出的问题的回答。我认为它更加令人困惑,而不是有所帮助。 - U. Windl

9

我不是专家,但这个方案也可能行得通。

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

实际上,当 nrow(dat) == 1 时,这并不起作用:原始 dat 将被保留。 - U. Windl

6

dat <- dat[-1, ] 可以实现,但会破坏数据框架的格式,并将其转化为其他类型。因此必须使用 dat <- data.frame(dat[-1, ]) 来避免这种情况,但这可能是一个特殊情况,因为该数据框架最初只有一列。


这是一条注释,而不是答案!尽管如此,我无法复现。 - U. Windl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接