也许更冗长,但假设您正在使用两个数据帧:
df1 <- data.frame(
row_id = c(1, 3, 6),
v1 = c(4, 12.5, 13.9),
v3 = c(12.5, 6, 11.3),
v6 = c(23.9, 11.3, 9),
stringsAsFactors = FALSE
)
df2 <- data.frame(
row_id = c(2, 4, 5),
v2 = c(5, 10.2, 9.3),
v4 = c(10.2, 7, 8.5),
v5 = c(9.3, 8.5, 8),
stringsAsFactors = FALSE
)
然后您可以执行以下操作(更新):
df1 <- df1 %>%
`colnames<-`(c('row_id', paste0('V', df1$row_id))) %>%
pivot_longer(cols=!row_id, names_to = 'column', values_to = 'val') %>%
mutate(col_id = readr::parse_number(column), .keep='unused')
df2 <- df2 %>%
`colnames<-`(c('row_id', paste0('V', df2$row_id))) %>%
pivot_longer(cols=!row_id, names_to = 'column', values_to = 'val') %>%
mutate(col_id = readr::parse_number(column), .keep='unused')
df_new <- bind_rows(df1, df2)
size = max(c(df1$row_id, df2$row_id))
df_final <- matrix(0, nrow=size, ncol=size)
for (i in 1:dim(df_new)[1]) {
df_final[df_new$row_id[i], df_new$col_id[i]] <- df_new$val[i]
}
如果你只想看到相关的单元格,你可以减少矩阵:
data.frame(df_final) %>%
filter_all(any_vars(. != 0)) %>%
select_if(colSums(.) != 0)
# X10 X20 X30 X40 X50 X60
# 1 4.0 0.0 12.5 0.0 0.0 23.9
# 2 0.0 5.0 0.0 10.2 9.3 0.0
# 3 12.5 0.0 6.0 0.0 0.0 11.3
# 4 0.0 10.2 0.0 7.0 8.5 0.0
# 5 0.0 9.3 0.0 8.5 8.0 0.0
# 6 13.9 0.0 11.3 0.0 0.0 9.0