2016-12-02 74 views
1

我可以添加列data.frame:如何将多个空列添加到0行的data.frame?

x <- head(iris) 
y <- x[1:nrow(x) > 7, ] 
x[c('NewCol1', 'NewCol2')] <- rep(c('a', 'b'), each = nrow(x)) 

对于0排data.frame,这是行不通的:

# > y 
# [1] Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
# <0 rows> (or 0-length row.names) 

y[c('NewCol1', 'NewCol2')] <- rep(c('a', 'b'), each = nrow(y)) 

# Error in value[[jvseq[[jjj]]]] : subscript out of bounds 

我发现这一点,Add Columns to an empty data frame in R,但它不帮助很大。

预期输出:

# > y 
# [1] Sepal.Length Sepal.Width Petal.Length Petal.Width Species  NewCol1  NewCol2 
# <0 rows> (or 0-length row.names) 
+0

我不明白'y'是否属于空数据框。它有内容。你能详细说明你在这里做什么吗? –

+1

@TimBiegeleisen,很抱歉。我编辑了这个问题。 – mt1022

+0

所以你有'x'作为6行的数据框。你的预期产出是多少? –

回答

2

考虑创建空数据帧以下代码:

df <- data.frame(Ints=integer(), 
       Characters=character(), 
       stringsAsFactors=FALSE) 

一种方式将新的列添加到该空数据帧是使用cbind()

df2 <- cbind(df, data.frame(Stuff=character(),stringsAsFactors=FALSE)) 

> df2 
[1] Ints  Characters Stuff  
<0 rows> (or 0-length row.names) 

然后,只需像往常一样添加您的数据,e 。G。

> df2[1,] <- c(1, "hello", "world") 
> df2 
    Ints Characters Stuff 
1 1  hello world 

如上所述,这可能会在Ints列中导致铸造问题。分配每一列避免了这一点,例如

df2$Ints <- c(1:5) 
df2$Stuff <- c("one", "two", "three", "four", "five") 

或者,你可以使用类似read.table在数据带上,并且明确指定的类的方式。

+0

这工作。但是'f2 [1,] < - c(1,“hello”,“world”)'把Ints col改成了字符! – mt1022

+0

无论如何,我接下来要做的是对由lapply生成的data.frames进行绑定(有些是空的)。这很重要。 – mt1022

2

我们可以通过设置col.names参数使用read.table

read.table(text = "",col.names = c(names(y), c("New_Col1", "New_Col2"))) 

#Sepal.Length Sepal.Width Petal.Length Petal.Width Specie New_Col1 New_Col2 
#<0 rows> (or 0-length row.names) 

我们还可以设置使用colClasses参数

read.table(text = "",col.names = c(names(y), c("New_Col1", "New_Col2")), 
       colClasses = c(sapply(y, class), "character", "character")) 

因此,在这种情况下,两个新的变量将得到character类我们所期望的类。