我正试图在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%