如何将rbind保存到data_table

问题描述 投票:0回答:1

我正在尝试向表中添加一行,虽然我可以让 rbind 自行工作,但我想将其保存到原始表中。例如:

 df <- data.frame(DATE = c('07/01/2022', '08/01/2022'),
                     `0` = c(4, 4),
                     `1` = c(5, 3),
                      `2` = c(5,3), check.names = FALSE)
日期 0 1 2
2022年7月1日 4 5 5
2022年8月1日 4 3 3
df2 <- data.frame(V1 = 2,
                     V2 = 4,
                     V3 = 5)
V1 V2 V3
2 4 5

我尝试在第一个表的最后一行下方添加 V1、V2 和 V3 的值,但仅限于第 0:3 列。我正在尝试的代码如下:

df[2:4] <- rbind(df[2:4], setNames(data.frame(TOTAL = 'Weights', df2), names(df[2:4])))

这会导致以下错误:

✖ Existing data has 3 rows.
✖ Element 1 of assigned data has 4 rows.
ℹ Only vectors of size 1 are recycled.

这是我想要保存的输出:

日期 0 1 1
2022年7月1日 4 5 5
2022年8月1日 4 3 3
2 4 5
r
1个回答
0
投票

当我想根据名称“仅组合”行绑定表时,我倾向于使用

data.table::rbindlist(list(...), fill=TRUE, use.names=TRUE)
或仅使用
dplyr::bind_rows(...)
,而不管缺少的列和列的顺序如何。

为了做到这一点,我们确实需要名称相同,但是......

library(data.table)
rbindlist(list(df, setNames(df2, names(df)[-1])),
          use.names = TRUE, fill = TRUE)
#          DATE     0     1     2
#        <char> <num> <num> <num>
# 1: 07/01/2022     4     5     5
# 2: 08/01/2022     4     3     3
# 3:       <NA>     2     4     5

library(dplyr)
bind_rows(df, setNames(df2, names(df)[-1]))
#         DATE 0 1 2
# 1 07/01/2022 4 5 5
# 2 08/01/2022 4 3 3
# 3       <NA> 2 4 5

为了能够单独在基 R 中执行此操作,我们需要填写

df2
以包含
df
中的列(和顺序)。

names(df2) <- names(df)[-1]
newdf2 <- cbind(df[NA,][1,setdiff(names(df), names(df2)),drop=FALSE], df2)
rbind(df, newdf2[,names(df)])
#          DATE 0 1 2
# 1  07/01/2022 4 5 5
# 2  08/01/2022 4 3 3
# NA       <NA> 2 4 5
  • 我们需要
    drop=FALSE
    (重复),因为当列选择减少到单列时,基础 R 的
    [
    往往会下降为向量,添加
    drop=FALSE
    使其保持为框架
  • 确保我们拥有所有相同的列
    df[NA,...]
    是将所有值转换为各自的
    NA
    类型(至少有六种不同的
    NA
    ),通常最好确保组合的列类型相同(否则错误或逻辑问题);
  • 确保列的顺序相同:使用
    newdf2
    和最终
    newdf2[, names(df)]
    是为了确保所有列的顺序完全相同
© www.soinside.com 2019 - 2024. All rights reserved.