R - 按元素组合两个数据 table 的简单方法是什么?

R - What's the simple way to combine two data table element-wise?

Table一个

varA 变量B
17 1
0 20

Table B

varA 变量B
100.00 5.88
0.00 100.00

Table C

varA 变量B
17 (100.00) 1.00 (5.88)
0 (0.00) 20 (100.00)

有没有办法将Table A + Table B“粘贴”到Table C之类的东西中?

C 中创建 A 的副本,您可以使用 sprintf 获得所需的格式。

C <- A
C[-1] <- sprintf('%d (%.2f)', as.matrix(A[-1]), as.matrix(B[-1]))
C

#  Group        varA        varB
#1     I 17 (100.00)    1 (5.88)
#2    II    0 (0.00) 20 (100.00)

我们可以使用tidyverse

library(dplyr)
library(stringr)
C <- A %>%
      mutate(across(where(is.numeric), ~
        str_c(., "(", round(B[[cur_column()]], 2), ")")))

或者可以使用sprintf

C <- A %>% 
    mutate(across(where(is.numeric), 
        ~sprintf("%d (%.2f)", ., B[[cur_column()]])))

数据

A <- structure(list(Group = c("I", "II"), varA = c(17L, 0L), varB = c(1L, 
20L)), class = "data.frame", row.names = c(NA, -2L))

B <- structure(list(Group = c("I", "II"), varA = c(100, 0), varB = c(5.88, 
100)), class = "data.frame", row.names = c(NA, -2L))

另一个基础 R 选项使用 Map + list2DF

> list2DF(c(A[1], Map(function(x, y) sprintf("%d (%.2f)", x, y), A[-1], B[-1])))
  Group        varA        varB
1     I 17 (100.00)    1 (5.88)
2    II    0 (0.00) 20 (100.00)

您也可以使用以下解决方案:

library(dplyr)
library(purrr)
library(glue)
library(stringr)

df1 %>%
  left_join(df2 %>%
              map_if(~ is.numeric(.x), ~ glue("({.x})")) %>%
              bind_cols(), by = "Group") %>%
  mutate(across(ends_with(".x"), ~ str_c(.x, get(str_replace(cur_column(), 
                                                             "\.x", "\.y")), sep = " "))) %>%
  select(- ends_with(".y"))

  Group   varA.x   varB.x
1     I 17 (100) 1 (5.88)
2    II    0 (0) 20 (100)