如何在R数据表(DT)中以一种方式格式化列,但以另一种方式格式化该列中的一行

时间:2019-04-01 00:49:39

标签: r dt

我正遇到一个DT问题,我想将1列的格式设置为scientific annotation,但是此列中的某些值是我正在处理的表的percentage值。

如果我事先将表中的值更改为paste(n, "%", sep = ' '),则rowcallback会卡在非数字值上

在任何一种情况下,我都可以使用rowcallback(请参见下文)来格式化scientific annotation的格式,或者在另一种情况下,可以使用formatPercentage('columnname', 2)来格式化百分比的列,但是我想对一列和每一行都要做,我需要以'n%表示,而其余的列是科学的。

是否可以对1列执行rowcallback,但排除特定的行,

rowcallback组合scientific annotation,然后将其他百分比格式的其他单元格格式化为百分比(x%)

下面的datatable生成sci。一个。但是如何将cars[5,2]更改为2个十进制的%值,并在其后加上%符号?

datatable(cars/10, 
          options = list(
                 rowCallback = JS(
      "function(row, data) {",
      "    $('td:eq(2)', row).html(data[2].toExponential(1));",
      "}")
          )
)

2 个答案:

答案 0 :(得分:1)

用R格式化列不是一个很好的选择,因为列类型将变成字符,并且您将失去对列进行排序的可能性。这是JavaScript的使用方式:

else
{
    int countMemberCat = 0;
    helper.openConnection();
    string query2 = "SELECT Count (*) as 'NoOfMembershipRate' FROM membershiprate WHERE memberrate_desc = @mdesc";
    MySqlCommand cmd2 = new MySqlCommand(query2, helper.getConnection());
    cmd2.Parameters.AddWithValue("mdesc", txtMemRateDesc.Text);
    MySqlDataReader reader = cmd2.ExecuteReader();

    while (reader.Read())
    {
        countMemberCat = int.Parse(reader["NoOfMembershipRate"].ToString());

    }
    helper.CloseConnection();

    if (countMemberCat > 0)
    {
        MessageBox.Show("Membership Category already exist!");
    }
    else
    {
        try
        {
            double price = double.Parse(txtMemRate.Text);
            ClearErrorMessage();

            DialogResult dr = MessageBox.Show("Are you sure you want to add new membership category?", "Add?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr == DialogResult.Yes)
            {
                if (helper.openConnection())
                {
                    string query = "INSERT INTO `membershiprate` (`memberrate_desc`, memberrate_id, `memberrate_price`, memberrate_count) VALUES (@mdesc, memberrate_id, @mprice, memberrate_id)";
                    MySqlCommand cmd = new MySqlCommand(query, helper.getConnection());
                    cmd.Parameters.AddWithValue("mdesc", txtMemRateDesc.Text);
                    cmd.Parameters.AddWithValue("mprice", txtMemRate.Text);

                    cmd.ExecuteNonQuery();
                    helper.CloseConnection();


                    this.Close();
                    MessageBox.Show("Successfully added!");
                }

enter image description here

答案 1 :(得分:0)

为了具有科学的注释,可以将函数formatC()与参数format = 'e'digits = 1一起使用。

formatC(cars$dist[1:5] / 10, format = 'e', digits = 1)
# [1] "2.0e-01" "1.0e+00" "4.0e-01" "2.2e+00" "1.6e+00"

要使百分比可视化,因为formatPercentage()会转换所有列,因此您可以使用paste()自行创建。

然后,只需创建一个条件,例如使用ifelse()来说明何时使用科学格式以及何时使用百分比百分号。

cars %>% 
  mutate_all(funs(. / 10)) %>% 
  mutate(Condition = 1:n()) %>% 
  mutate(dist = ifelse(Condition == 5,
                       paste(round(dist, 2), '%'),
                       formatC(dist, format = 'e', digits = 1))
  ) %>% 
  select(-Condition) %>% 
  datatable()

enter image description here