我正在尝试向表中添加一行,虽然我可以让 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 |
当我想根据名称“仅组合”行绑定表时,我倾向于使用
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)]
是为了确保所有列的顺序完全相同