我有一个数据框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
,即使数据框只有一列?
答案 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"