Примените функцию к фрейму данных с числовыми объектами и напечатайте десятичные точки / конечные нули - PullRequest
0 голосов
/ 03 мая 2019

У меня есть фрейм данных с числовыми объектами из таблицы сопряженности:

x=sample(c(0,1),100,replace=T)
y=sample(c(0,1),100,replace=T)
my_table=table(x,y)
x.true=sum(my_table[2,])
y.true=sum(my_table[,2])
x.true.y.true=my_table[2,2]
x.true.y.false=my_table[2,1]
x.false.y.true=my_table[1,2]
x.false.y.false=my_table[1,1]
my_df=data.frame(x.true,y.true,
                 x.true.y.true,x.true.y.false,
                 x.false.y.true,x.false.y.false)

Я хочу вывести десятичные точки / конечные нули, но sprintf () не работает, потому что он превращает элементы всимволы:

> sprintf('%.3f',my_df)
[1] "43.000" "55.000" "22.000" "21.000" "33.000" "24.000"

Упаковка в as.numeric также не работает, потому что она просто снова обрезает нули!

> as.numeric(sprintf('%.3f',my_df))
[1] 43 55 22 21 33 24

Даже format.data.frame () не работает!

> format.data.frame(my_df,nsmall=5)
  x.true y.true x.true.y.true x.true.y.false x.false.y.true x.false.y.false
1     43     55            22             21             33              24

Как заставить мой фрейм данных, состоящий из числовых объектов, печатать десятичные точки / конечные нули?

1 Ответ

1 голос
/ 03 мая 2019

Сначала , sprintf() вернет символьный вектор, как сказано в виньетке функции:

Оболочка для функции C sprintf, которая возвращает вектор символов, содержащий форматированную комбинацию значений текста и переменных.

Второй , ваш фрейм данных состоит из числовых объектов, как вы правильно указали, поэтому вы не можете получить десятичные точки. У вас есть два варианта:

  1. обернуть все объекты в фрейме данных в функцию as.double() и затем использовать format.data.frame
  2. применить as.double () к элементам фрейма данных, а затем использовать format.data.frame

Вариант 1 быстрый и грязный и может работать для ваших данных:

my_df=data.frame(as.double(x.true),as.double(y.true),
                 as.double(x.true.y.true),as.double(x.true.y.false),
                 as.double(x.false.y.true),as.double(x.false.y.false))
format.data.frame(my_df,nsmall=5)

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

Опция 2 немного сложнее, но она масштабируема.

Вы можете подозревать, что не можете использовать apply() для фрейма данных, и вы были бы правы. Чтобы обойти это, вы должны превратить его в матрицу, применить функцию, транспонировать ее, превратить обратно в фрейм данных, отформатировать, а затем присвоить ей имена:

my_df2=format.data.frame(as.data.frame(t(apply(as.matrix(my_df),1,function(x) as.double(x)))),nsmall=5)
names(my_df2)=names(my_df)
my_df2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...