我可以向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 :(得分:3)
考虑以下创建空数据框的代码:
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)
然后像往常一样添加您的数据,例如
> 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
的内容来引入您的数据,并以这种方式明确地分配类。
答案 1 :(得分:2)
我们可以通过设置read.table
参数
col.names
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
class。