当前位置: 首页 > 知识库问答 >
问题:

根据数据计算中值。R中的表列

段渊
2023-03-14

我正在尝试计算多个列的中值,但是我的数据有点奇怪。它看起来像下面的示例。

library(data.table)

dt <- data.table("ID" = c(1,2,3,4),"none" = c(0,5,5,3), 
                 "ten" = c(3,2,5,4),"twenty" = c(0,2,3,1))


   ID none ten twenty
1:  1    0   3      0
2:  2    5   2      2
3:  3    5   5      3
4:  4    3   4      1

在表中到列表示该值的出现次数。我想计算中位数的出现次数。

例如对于ID = 1

median(c(10, 10, 10))

是我想要创建的计算。

对于ID=2

median(c(0, 0, 0, 0, 0, 10, 10, 20, 20))

我尝试过使用<code>rep()或<code>rep(10,2)),这就是我所期望的。我只是努力创建一个列表或向量,每个列都有重复。

共有3个答案

宗乐池
2023-03-14

以下是避免按行操作和改变形状的方法:

dt[, m := {
    cSD  = Reduce(`+`, .SD, accumulate=TRUE)
    k    = floor(cSD[[length(.SD)]]/2)

    m    = integer(.N)
    for(i in seq_along(cSD)) {
        left = m == 0L
        if(!any(left)) break
        m[left] = i * (cSD[[i]][left] >= k[left])
    }
    names(.SD)[m]
}, .SDcols=none:twenty]

这给了

   ID none ten twenty    m
1:  1    0   3      0  ten
2:  2    5   2      2 none
3:  3    5   5      3  ten
4:  4    3   4      1  ten

对于循环,我借用了@alexis_laz的风格,例如 https://stackoverflow.com/a/30513197/

我跳过了列名的翻译,但是这非常简单。您可以使用< code>c(0,10,20)来代替< code >名称(。SD)在最后。

太叔志文
2023-03-14

您需要一个字典来将列名翻译成相应的数字,然后它相当简单:

dict = data.table(name = c('none', 'ten', 'twenty'), number = c(0, 10, 20))

melt(dt, id.var = 'ID')[
  dict, on = c(variable = 'name')][, median(rep(number, value)), by = ID]
#   ID V1
#1:  1 10
#2:  2  0
#3:  3 10
#4:  4 10
孙渝
2023-03-14

这是另一种data.table方式(假设唯一的ID):

dt[, median(rep(c(0, 10, 20), c(none, ten, twenty))), by=ID]
#    ID V1
# 1:  1 10
# 2:  2  0
# 3:  3 10
# 4:  4 10

这只是一种不经过整形就能得到@eddi答案的尝试(我倾向于把整形作为最后的手段)。

 类似资料:
  • 本文向大家介绍awk 根据表格数据计算列中的值的中位数,包括了awk 根据表格数据计算列中的值的中位数的使用技巧和注意事项,需要的朋友参考一下 示例 给定一个;用作列定界符的文件。我们使用以下为GNU awk编写的程序在第二列中计算值的中位数。提供的输入是学生组的成绩列表: 该程序的输出为1。 请记住,它NR保存了要处理的行数,END因此在块中它保存了文件中的总行数。 awk的许多实现都没有对数组

  • 本文向大家介绍awk 根据表格数据计算列中的平均值,包括了awk 根据表格数据计算列中的平均值的使用技巧和注意事项,需要的朋友参考一下 示例 给定一个;用作列定界符的文件。我们使用以下程序在第二列中计算值的平均值,提供的输入是学生组的成绩列表: 该程序的输出为2.125。 请记住,它NR保存了要处理的行数,END因此在块中它保存了文件中的总行数。 请记住,在许多应用程序(监视,统计)中,中位数是更

  • 这就是我的问题:我有一些代码从29个excel文件中提取一些数据,并将标记为“sw”的任何内容组织到一个变量中,将标记为“rep”的所有内容组织到另一个变量中: 然后我想找出这些文件的平均值和标准偏差,除非我使用了平均值(sw),它告诉我“参数不是数字或逻辑的:返回NA”。如果我打开“sw”或“rep”,我会得到如下结果: $

  • 我有一张800万行的大桌子。此表有15列带有数值,但这些值只能是0,并且只能是该列特有的另一个数值。我想根据特定值为这些列中的每一列创建两个新列。这些新值总是特定于列。 这是我的数据外观的虚拟示例: 这是我想要的输出 对应关系始终相同,即中1的值为,中2的值为,中3的值为。 我知道我可以用这样的东西 但我的真实数据有15列,需要大量的复制粘贴,有没有干净的方法?

  • 我正在寻找一个整洁的解决以下问题。 我有以下示例数据集: 我需要根据列2和列1中的前一个值填写NAs。如果我从第一个NA(第1列,第2行)开始,并且第2列大于1,那么我将把第1列的值(第1行)乘以第2列的值。那么如果col2小于等于1,那么col1正好等于前面的值。 这应该是最终结果: 我尝试了但没有得到想要的结果: 显然,我没有捕获我想要使用前一行的值的部分。任何帮助都将不胜感激。

  • 问题内容: 问题: 我想做的是通过连续减少基础数字逐步减少a中的值。 我不知道的术语这个-我想我可以做的东西和,但我觉得我自己领先于白费力气有… 起始代码: 所需的输出: 理由: 从-的底数开始-中的每个值都减去余量,这是津贴额本身,因此发生以下步骤: 从100开始,我们可以将其完全删除,因此变为,我们现在保留为 下一个值是并且我们仍然可用,因此它再次变为并且我们已经离开。 下一个值是-我们只剩下