2015-09-15 4 views
0

Мой вопрос кажется таким же простым, как this, но я не понимаю, что не так.Как округлить значения в списке R - округлять только числовые значения?

У меня есть следующие данные:

myData <- structure(list(structure(0.964671123392506, .Names = "W"), 0.022361343060769242, 
         structure(0.964695704055953, .Names = "W"), 0.022162269470046909, 
         structure(0.958418109351607, .Names = "W"), 0.045107813263059401, 
         structure(0.874545371360235, .Names = "W"), 1.59340622525965e-06), .Dim = c(2L, 
                            4L), .Dimnames = list(c("Measure", "c-value"), c("col1", 
                                         "col2", "col3", "col4"))) 

которые список:

typeof(myData) 
[1] "list" 

Я хочу округлить все элементы с выбранным количеством цифр. Я не могу просто применить круглую функцию, поэтому я написал следующие функции:

roundMe <- function(x, numbers=3) 
    { 
    if (is.numeric(x)) {x <- as.character(sprintf("%3.2f", round(x, digits=numbers)))} 
    #there's problem: 
    x 
} 

и пытался применить его

apply(myData,1:2,roundMe) 

, который дает:

 col1 col2 col3 col4 
Measure List,1 List,1 List,1 List,1 
c-value List,1 List,1 List,1 List,1 

при изменении "х" в roundMe (последняя строка функции) на as.character (x), он возвращает не округленное число. Что не так? Должен ли я использовать другую функцию приложения? Должен ли я преобразовывать список в, например, в фрейм данных?

+1

есть причина, вы работаете с этой конкретной структурой? – A5C1D2H2I1M1N2O1R2T1

+0

Также у вас есть числовые значения. Не знаете, почему вы проверяете числовое число, когда они все числовые. Кроме того, вы не можете использовать 'round()' в символьной строке. –

+0

Я получил указанную структуру (я меняю имена столбцов и строк), следуя этому ответу: http://stackoverflow.com/questions/21239826/using-shapiro-test-on-multiple-columns-in-a-data-frame – matandked

ответ

3

У вас есть список. Не используйте apply, что будет принуждать к матрице, а не использовать lapply в сочетании с [<- заменить содержимое myData, сохраняя при этом первоначальную структуру,

Теперь, я не вижу никаких причин, почему вы были бы попытки принуждать к символу, когда вы могли бы просто использовать round и сохранить числовое поле

myData[] <- lapply(myData,round,2) 
myData 
#   col1 col2 col3 col4 
# Measure 0.96 0.96 0.96 0.87 
# c-value 0.02 0.02 0.05 0 
+0

Почему myData [] требуется вместо myData (чтобы сохранить тип списка?) – matandked

Смежные вопросы