防止[.data.frame拖放维度只有一列

时间:2016-03-02 20:46:36

标签: r dataframe

我有一个数据框demos,其中n列(取决于外部输入),其中n = 1,2,3 ...

我想删除某些行,然后在此数据框中添加新列。在n > 1时,以下代码可以正常运行,其中demos.part始终为R data.frame

demos.part <- demos[-i, ]  // remove i-th row
demos.part[,"new column name"] <- as.vector(<new data>)

但是,当n == 1时,第一行中的demos.part变为vector。然后第二行不再起作用。

当然,我们可以通过硬编码来修复特殊情况。是否有一致(优雅)方式从data.frame中删除行并仍返回data.frame,即使数据框只有一列?

2 个答案:

答案 0 :(得分:3)

如果demos.part <- demos[-i, ]只有一列,那么您的第一行demis.part只会从数据框中删除到矩阵:

# One column: result is a vector
> data.frame(a=letters)[1,]
[1] a
Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z
# 2 cols: result is a df with 1 row
> data.frame(a=letters, b=letters)[1,]
data.frame with 1 row and 2 columns
         a        b
  <factor> <factor>
1        a        a

要了解其原因,您可以检查[.data.frame的参数,其中drop参数的默认值取决于列数:

> args(`[.data.frame`)
function (x, i, j, drop = if (missing(i)) TRUE else length(cols) == 
    1) 
NULL

无论何时,只要你想要防止丢弃维度,只需在任何索引参数之后添加drop=FALSE(包括故意空白的索引参数;注意空白列索引的两个逗号之间的空格):

> data.frame(a=letters)[1, , drop=FALSE]
data.frame with 1 row and 1 column
         a
  <factor>
1        a

在根据外部输入决定要选择多少行/列时,应始终使用drop=FALSE,因为总是有可能只选择一行。或者,使用dplyr包中的data_frame函数创建一个数据框,其行为中具有较少的奇怪边缘情况:

> library(dplyr)
> data_frame(a=letters)[1,]
Source: local data frame [1 x 1]

      a
  (chr)
1     a

答案 1 :(得分:0)

回应关于colnames的命令 - 我认为它们不会消失。 请考虑以下代码:

remove.row <- function(df,n) { as.data.frame(df[-n,]) }
#
a <- data.frame(col1=c(1,2),col2=c("A","B"))
a
class(a)
colnames(a)
#
a <- remove.row(a,1)
a
class(a)
colnames(a)
#
a <- remove.row(a,1)
a
class(a)
colnames(a)

产生

> a
  col1 col2
1    1    A
2    2    B
> class(a)
[1] "data.frame"
> colnames(a)
[1] "col1" "col2"
> #
> a <- remove.row(a,1)
> a
  col1 col2
2    2    B
> class(a)
[1] "data.frame"
> colnames(a)
[1] "col1" "col2"
> #
> a <- remove.row(a,1)
> a
[1] col1 col2
<0 rows> (or 0-length row.names)
> class(a)
[1] "data.frame"
> colnames(a)
[1] "col1" "col2"