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)
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)