我如何使用粘贴将百分比插入 R 中的 table
How can i use paste to insert percentages into a table in R
我想在 R
中的 table 中的每个单元格中插入一个百分比
这是我正在使用的数据框
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)
但是这个 returns 错误: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%)
谁能帮我解决我哪里出错了?
发生错误是因为您试图将 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%
您需要避开第一列 - 字符为 class。
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)
我想在 R
中的 table 中的每个单元格中插入一个百分比这是我正在使用的数据框
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)
但是这个 returns 错误: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%)
谁能帮我解决我哪里出错了?
发生错误是因为您试图将 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%
您需要避开第一列 - 字符为 class。
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)