按标准在数据框中引入数据

Introducing data in a dataframe by criterion

假设我有以下数据框:

df <- data.frame(A=c(0),
                 B=c(0), 
                 C=c(0), 
                 D=c(0),
                 E=c(0)) 

现在,我想在 df 中引入一些像这样的向量,在 df 中考虑但不在向量中的参数缺失时引入 0

Ex1 <- data.frame(B=c(1), 
                  C=c(2), 
                  D=c(4))

Ex2 <- data.frame(A=c(1), 
                  E=c(6))

也就是说,结果应该是这样的:

A B C D E
0 0 0 0 0
0 1 2 4 0
1 0 0 0 6

我们可以使用dplyr中的bind_rows,缺少的时候会自动补上NA,之后把NA替换成0

library(dplyr)
library(tidyr)
bind_rows(df, Ex1, Ex2) %>%
    mutate(across(everything(), replace_na, 0))

-输出

  A B C D E
1 0 0 0 0 0
2 0 1 2 4 0
3 1 0 0 0 6

我们也可以在 base R 中使用 row/column 索引来做到这一点,即创建一个 matrix 的 0 值,然后用行索引和来自“ Ex1", "Ex2" 数据

m1 <- matrix(0, nrow = 3, ncol = 5, dimnames = list(NULL, LETTERS[1:5]))
m1[2, names(Ex1)] <- as.matrix(Ex1)
m1[3, names(Ex2)] <- as.matrix(Ex2)
 m1
     A B C D E
[1,] 0 0 0 0 0
[2,] 0 1 2 4 0
[3,] 1 0 0 0 6

您可以试试下面的代码

library(data.table)
library(dplyr)

list(df, Ex1, Ex2) %>%
  rbindlist(fill = TRUE) %>%
  replace(is.na(.), 0)

这给出了

   A B C D E
1: 0 0 0 0 0
2: 0 1 2 4 0
3: 1 0 0 0 6

你可以试试小循环。

for (i in seq.int(L)) {
  df[i + 1, ] <- 0
  z <- colSums(df) == 0 & names(df) %in% names(L[[i]])
  df[i + 1, z] <- L[[i]]
  }
df
#   A B C D E
# 1 0 0 0 0 0
# 2 0 1 2 4 0
# 3 1 0 0 0 6

数据:

df <- structure(list(A = 0, B = 0, C = 0, D = 0, E = 0), row.names = 1L, class = "data.frame")

ex1 <- structure(list(B = 1, C = 2, D = 4), class = "data.frame", row.names = c(NA, 
-1L))

ex2 <- structure(list(B = 1, C = 2, D = 4), class = "data.frame", row.names = c(NA, 
-1L))

L <- list(ex1, ex2)