Форматировать значения в списке фреймов данных в процентах - PullRequest
0 голосов
/ 10 июля 2019

Я хочу отформатировать данные в списке фреймов данных в процентах. Значения являются факторами.

df.ls <- list(list(id = c(1,2,3), x = c(4,5,6), works = c(7,8,9)),
              list(id = c(10,11,12), x = c(13,14,15), works = c(16,17,18)))

Для этого я создаю свой процентный формат:

library(scales)
my_perc_format=percent_format(accuracy = .01, scale = 100,
                suffix = "%",decimal.mark = ".")

Затем я пытаюсь применить его к своему списку, форматируя значения в виде чисел:

test=lapply(df.ls, function(x) 
    my_perc_format(as.numeric(as.character(unlist(df.ls[[x]])))))

Отдельно это работает отлично, но, к счастью, не будет:

my_perc_format(as.numeric(as.character(unlist(df.ls[[1]]))))

Изменить:

This is one data frame from the list

Значения теперь являются факторами, но я хочу быть числом при преобразовании в проценты, если это возможно.

EDIT:

Это еще одна попытка конвертировать мои данные. На этот раз это как фактор. Без relist() вывод в порядке, но не в нужной структуре. С relist() я получаю искомую структуру, но она возвращает NA .

df.ls <- list(list(id = as.factor(c("1","2","3")), x = as.factor(c("4","5","6")), works = as.factor(c("7","8","9"))),
              list(id = as.factor(c("10","11","12")), x = as.factor(c("13","14","15")), works = as.factor(c("16","17","18"))))
names(df.ls)=c("list1","list2")

test=as.data.frame(sapply(df.ls, function(x){
  relist(my_perc_format(as.numeric(as.character(unlist(x)))),x)
}))

1 Ответ

2 голосов
/ 10 июля 2019

Не вводить список в lapply, используйте x напрямую.

lapply(df.ls, function(x) my_perc_format(as.numeric(as.character(unlist(x)))))

#[[1]]
#[1] "100.00%" "200.00%" "300.00%" "400.00%" "500.00%" "600.00%" "700.00%" "800.00%" "900.00%"

#[[2]]
#[1] "1 000.00%" "1 100.00%" "1 200.00%" "1 300.00%" "1 400.00%" "1 500.00%" "1 600.00%" "1 700.00%" "1 800.00%"

Чтобы получить вывод в виде списка данных, мы можем сделать

lapply(df.ls, function(x) {
    vals <- unlist(x)
    data.frame(original = vals, value = my_perc_format(vals), row.names = NULL)
})

#[[1]]
#  original   value
#1        1 100.00%
#2        2 200.00%
#3        3 300.00%
#4        4 400.00%
#5        5 500.00%
#6        6 600.00%
#7        7 700.00%
#8        8 800.00%
#9        9 900.00%

#[[2]]
#  original     value
#1       10 1 000.00%
#2       11 1 100.00%
#3       12 1 200.00%
#4       13 1 300.00%
#5       14 1 400.00%
#6       15 1 500.00%
#7       16 1 600.00%
#8       17 1 700.00%
#9       18 1 800.00%

Или для сохранения той же структуры, что и в исходном списке, мы можем использовать relist

lapply(df.ls, function(x) {
   relist(my_perc_format(unlist(x)), x)
})

#[[1]]
#[[1]]$id
#[1] "100.00%" "200.00%" "300.00%"

#[[1]]$x
#[1] "400.00%" "500.00%" "600.00%"

#[[1]]$works
#[1] "700.00%" "800.00%" "900.00%"


#[[2]]
#[[2]]$id
#[1] "1 000.00%" "1 100.00%" "1 200.00%"

#[[2]]$x
#[1] "1 300.00%" "1 400.00%" "1 500.00%"

#[[2]]$works
#[1] "1 600.00%" "1 700.00%" "1 800.00%"

EDIT

as.data.frame(lapply(df.ls, function(x) {
   temp = factor(my_perc_format(as.numeric(as.character(unlist(x)))))
   split(temp, rep(seq_along(x) , lengths(x)))
}))

#  list1.1 list1.2 list1.3   list2.1   list2.2   list2.3
#1 100.00% 400.00% 700.00% 1 000.00% 1 300.00% 1 600.00%
#2 200.00% 500.00% 800.00% 1 100.00% 1 400.00% 1 700.00%
#3 300.00% 600.00% 900.00% 1 200.00% 1 500.00% 1 800.00%

При необходимости вы можете изменить имена столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...