当我初始化新数组时,我是否需要用实际数值初始化该字段中的每个值?
2 回答
如何附加新字段将取决于您拥有的对象。选项如下。如果length()
您尝试附加的变量不等于您希望附加到的对象的行数,那么您需要先填充新列/变量NA
,然后将变量附加到新的正确元素中创建的对象。例如,与
df <- data.frame(var1 = 1:5, var2 = LETTERS[1:5])
我们想在c(1,3,4)
中的第三个变量的第 1、2 和 5 行添加一个向量df
,然后我们可以这样做:
df$var3 <- NA ## note the single NA is recycled to the correct length
然后使用子集将新数据插入到正确的元素中
df$var3[c(1,2,5)] <- c(1,3,4)
这使:
> df$var3[c(1,2,5)] <- c(1,3,4)
> df
var1 var2 var3
1 1 A 1
2 2 B 3
3 3 C NA
4 4 D NA
5 5 E 4
如果您希望附加的变量长度正确,则无需初始化任何内容。在这种情况下,使用下面描述的方法之一来实现您想要的,具体取决于您是否有数据框或矩阵。
假设一个数据框
如果你有一个数据框,那么有几种方法。例如,使用
df <- data.frame(var1 = 1:10, var2 = LETTERS[1:10])
我们能做的
> df$var3 <- letters[1:10]
> df
var1 var2 var3
1 1 A a
2 2 B b
3 3 C c
4 4 D d
5 5 E e
6 6 F f
7 7 G g
8 8 H h
9 9 I i
10 10 J j
我更喜欢transform()
df <- transform(df, var3 = letters[1:10])
或相关的within()
df <- within(df, var3 <- letters[1:10]) ## note diff syntax
你也可以做
df[, "var3"] <- letters[1:10]
或者
df[, 3] <- letters[1:10]
但后者不会产生具有名称的变量,"var3"
而是获得默认名称。
您还可以使用cbind()
将列绑定到数据框(也适用于矩阵)。请注意,您必须将数据框作为第一个参数传递或"data.frame"
直接调用该方法,否则您不会得到数据框:
df <- cbind(df, var3 = letters[1:10])
df2 <- cbind.data.frame(var3 = letters[1:10], df)
## note `df2` will have `var3` as the first column here
假设一个矩阵
如果你有一个矩阵,那么选项基本上减少为使用cbind()
. 使用
mat <- matrix(1:20, ncol = 2)
你可以做
mat <- cbind(mat, 1:10)
其他选项不起作用。
当您尝试将空向量添加到现有矩阵/数据框时,该向量必须与数组中的其他行/列长度相同。我想最好的办法是添加一个 NA 或 NULL 值的向量,您可以在填写数据时替换它们。例如,使用包中的iris
数据datasets
:
iris.new <- data.frame(iris, add = rep(NA, nrow(iris))
然后使用基本的解析命令来填充数据。
iris.new[13, "add"] <- 100
希望有帮助。