Как я могу использовать вставить, чтобы вставить проценты в таблицу в R - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь вставить процент в каждую ячейку таблицы в 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: без нумерации c аргумент бинарного оператора

мой желаемый вывод выглядит так:

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

Может кто-нибудь помочь мне с тем, где я ошибся?

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Вам нужно избегать первого столбца - который относится к классу символов.

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)
0 голосов
/ 01 апреля 2020

Ошибка возникает из-за того, что вы пытаетесь привести свой столбец category к числовому значению c. Вторая проблема заключается в том, что 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%   
...