如何使用粘贴在R中的表格中插入百分比



我正试图在R 中的表中的每个单元格中插入一个百分比

这是我使用时的数据帧

1 a          1535      4      0     1539
2 b           768      6      0      774
3 c           112      1      0      113
4 d           279      4      0      283
5 e           231      5      0      236

这是我用来制作它的代码:

df <-structure(
list(
category = c(
"a",
"b",
"c",
"d",
"e"
),
group1 = c(1535,
768, 112, 279, 231),
group2 = c(4, 6, 1, 4, 5),
group3 = c(0,
0, 0, 0, 0),
groupall = c(1539, 774, 113, 283, 236)
),
class = c("grouped_df",
"tbl_df", "tbl", "data.frame"),
row.names = c(NA, 5L),
groups = structure(
list(
category = c(
"a",
"b",
"c",
"d",
"e"
),
.rows = list(1L,
2L, 3L, 4L, 5L)
),
row.names = c(NA,-5L),
class = c("tbl_df",
"tbl", "data.frame"),
.drop = FALSE
)
)

我试过这个代码:

findPerc<- function(x){
percent <- as.numeric(round((x/10000) * 100, digits = 2))
paste(percent, "%", sep = '')
}

然后使用将其应用于数据帧

df <- apply(df,c(1,2),findPerc)

但这会返回错误:x/10000中的错误:二进制运算符的非数字参数

我想要的输出看起来像:

1 a          1535(15.35%)     4(0.04%)     0(0.00%)    1539(15.39%)
2 b           768 (7.65%)     6(0.06%)      0 (0.00%)     774(7.74%)

有人能帮我解决哪里出了问题吗?

您需要避免第一列-这是字符类。

findPerc<- function(x){
percent <- as.numeric(round((x/10000) * 100, digits = 2))
paste(x, "(", paste(percent, "%", sep = ''), ")", sep = "")
}
df[, 2:5] <- apply(df[, 2:5],c(1,2), findPerc)
df
#   category       group1   group2 group3     groupall
# 1        a 1535(15.35%) 4(0.04%)  0(0%) 1539(15.39%)
# 2        b   768(7.68%) 6(0.06%)  0(0%)   774(7.74%)
# 3        c   112(1.12%) 1(0.01%)  0(0%)   113(1.13%)
# 4        d   279(2.79%) 4(0.04%)  0(0%)   283(2.83%)
# 5        e   231(2.31%) 5(0.05%)  0(0%)   236(2.36%)

代替c(1,2),将函数应用于整个列向量,如

apply(df[, 2:5], 2, findPerc)

对于将函数应用于前两行,您可以这样做

apply(df[1:2, 2:5], 2, findPerc)

由于您试图将category列强制为数值,因此发生错误。第二个问题是apply将所有选定的页边距强制为相同的类型,在本例中为字符。观察:

apply(df, 2, mode)
category      group1      group2      group3    groupall 
"character" "character" "character" "character" "character" 

如果排除category列:

> apply(df[,2:4], 2, mode)
group1    group2    group3 
"numeric" "numeric" "numeric" 

由于我是tidyverse的粉丝,我建议你使用mutate_if只转换那些可以转换的:

df %>% 
mutate_if(is.numeric, findPerc)
# A tibble: 5 x 5
category group1 group2 group3 groupall
<chr>    <chr>  <chr>  <chr>  <chr>   
1 a        15.35% 0.04%  0%     15.39%  
2 b        7.68%  0.06%  0%     7.74%   
3 c        1.12%  0.01%  0%     1.13%   
4 d        2.79%  0.04%  0%     2.83%   
5 e        2.31%  0.05%  0%     2.36%   

最新更新