在具有缺失值的数据框中添加行

9

所以我有一个数据框架

df <- data.frame( A=1:10, B=LETTERS[1:10], C=letters[1:10], stringsAsFactors= F )

我想在这个数据框中添加一行,A=11,C="K",但是我没有关于列C的信息。实际上,除了A和B之外,我事先不知道数据框中还有哪些其他列。这些缺失的列应该得到一个NA。我能想到的最好方法是:

tmp <- rep( NA, ncol( df ) ) # Batman!
df <- rbind( df, tmp )
df[ nrow( df ), "A" ] <- 11
df[ nrow( df ), "B" ] <- "K"

有没有更简单的方法?

请查看我在答案中添加的新版本。我认为那是最干净的版本。 - BrodieG
2个回答

14

基础版本:

new.row <- list(A=11, B="K")
df[nrow(df) + 1, names(new.row)] <- new.row

plyr 版本:

library(plyr)
new.row <- data.frame(A=11, B="K", stringsAsFactors=F)
df <- rbind.fill(df, new.row)

两者都会产生:

    A B    C
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
11 11 K <NA>

你也可以将基础版本推广到更多行:
more.rows <- data.frame(A=15:20, B=letters[15:20], stringsAsFactors=F)
df[(nrow(df) + 1):(nrow(df) + nrow(more.rows)), names(more.rows)] <- more.rows

生产:

    A B    C
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
11 11 K <NA>
12 15 o <NA>
13 16 p <NA>
14 17 q <NA>
15 18 r <NA>
16 19 s <NA>
17 20 t <NA>

@一月,我也添加了一个“base”版本。 - BrodieG
基础版本中使用了match非常好,但请注意这种方法会将整数列更改为字符。 - Matthew Plourde
@BrodieG 正如Matthew所指出的那样,第一个示例有一个缺陷(我选择混合整数和字符的原因就在这里...) - January
@January,看更新,虽然我认为现在Matthew的更干净。 - BrodieG

6
这里有一个保留数据类型的替代基础版本。
new.row <- head(df[NA,], 1)
new.row[c('A', 'B')] <- list(A=11, B='K')
rbind(df, new.row)

3
好的;第一行怎么样翻译成df[1,][NA,]?这样我们就不会生成一个与df大小相同的新数据框了。 - January

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接